> 文档中心 > LeetCode - 位运算专题

LeetCode - 位运算专题

文章目录

  • 一、运算符
    • 1. 优先级
    • 2. 各个运算符
      • ① 双目逻辑运算符
  • 二、位运算
      • 1. 运算符
      • 2. 操作
        • ① n 的二进制表示中第 k 位是几
        • ② lowbit 操作
  • 三、刷题

一、运算符

1. 优先级

单目逻辑运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 双目逻辑运算符 > 条件运算符 > 赋值运算符。

2. 各个运算符

① 双目逻辑运算符

   && 参与操作的数都为 时,结果才为真,否则为假。
   || 参与操作的数都为 时,结果才为假,否则为真。
   ! 操作数为真,运算结果为假;操作数为假,运算结果为真。


二、位运算

1. 运算符

   &x & y,一个数 & 1是它本身,一个数 &0 为 0;
   |x | y,一个数 | 1变成1,只有当两个数都为 0 时,结果才为 0;
   ^x ^ y,两个相同数 ^,结果为 0,两个不同数 ^,结果为 1,任何一个数和 0 异或的结果是它本身,异或运算满足结合律和交换律;
   ~~x,0 取反结果是 1,1 取反结果是 0;
   <<x << y:先将 x 用二进制表示,再左移 y 位,并且在尾部填 y 个 0;执行结果是 x * 2y
   >>x >> y:先将 x 用二进制表示,对于正数右移动 y 位,对于负数右移y位后高位补上 1;执行结果是 [x / 2y],[]表示下取整;

2. 操作

① n 的二进制表示中第 k 位是几

   n >> k & 1,个位是第 0 位,依次类推

② lowbit 操作

   作用:lowbit(x):返回 x 的二进制表示中最后一位 1,也是二进制表示;
   形式: x & -x, -x = ~x + 1;
   应用:统计 x 二进制表示中 1 的个数;


三、刷题

LeetCode 191. 位1的个数 原题链接

    ( 1 ) (1) (1) lowbit操作,返回 x 的二进制表示下的最后一位 1;
    ( 2 ) (2) (2) 每次减去最后一位 1,同时统计次数;

class Solution {public:    uint32_t lowbit(uint32_t x) {   return x & -x;    }    int hammingWeight(uint32_t n) { int cnt = 0; while (n) {     n -= lowbit(n);      cnt ++; } return cnt;    }};

LeetCode 461. 汉明距离 原题链接

    ( 1 ) (1) (1) 遍历 xy这两个数的二进制表示中有多少位不一样的;

class Solution {public:    int hammingDistance(int x, int y) { int res = 0; while (x || y) {     res += (x & 1) ^ (y & 1);     x >>= 1;     y >>= 1; } return res;    }};

LeetCode 136. 只出现一次的数字 原题链接

    ( 1 ) (1) (1) 运用到 ^的第一个性质:满足交换律和结合律,通过交换将所有相同的数配对,^之后的结果为 0;
    ( 2 ) (2) (2) 运用到 ^的第二个性质:相同数 ^0,任何一个数和 0异或是它本身;
    ( 3 ) (3) (3) 将所有数进行异或,异或后最终的结果就是但单独出现的那个数;

class Solution {public:    int singleNumber(vector<int>& nums) { int res = 0; for (auto x : nums) res ^= x; return res;    }};