LeetCode - 位运算专题
文章目录
一、运算符
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) 遍历 x
和 y
这两个数的二进制表示中有多少位不一样的;
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; }};