LeetCode: 位运算 题型知识点
与运算: &
或运算: |
异或运算: ^
左移:分为带符号左移和无符号左移
无符号左移:<< (相当于乘2)。低位补0 。
带符号左移:<<< 。正数左移低位补0,负数左移低位补1。
右移:分为带符号右移和无符号右移
无符号右移:>> (相当于除2)。高位补0 。
带符号右移:>>>。正数右移高位补0,负数右移高位补1。比如:4 >> 1,结果是2;-4 >> 1,结果是-2。-2 >> 1,结果是-1。
- 判断x的最后一位是0还是1: (x & 1) == 1; 这里注意一定要在前面加(),不然会报错。
78. 子集 - 把最低位的1变成0 : n & (n-1),可以用来判断一个数是否为2的幂:231. 2的幂
- 计算一个二进制数有几个1:
int count = 0;
while(n!=0){
count++;
n = n & (n-1);
}
return count;
- 去掉偶数的重复用异或运算:
异或运算的特点是对于两个相同的数 x ^ x = 0。
比如一个集合内只有一个数出现奇数次,其他数出现偶数次,则可以用异或运算把所有元素异或一遍,剩下的数就是出现奇数次的数。
389. 找不同
268. 丢失的数字 - 用位运算代替加减法
用异或运算计算非进位部分,用与运算和位移运算计算进位部分
371. 两整数之和