常见位运算总结
1.基础位运算
&:按位与 有0就是0
|:按位或 有1就是1
^: 相同为0,相异为1/无进位相加
<<:左移 >>:右移
2.判断一个数的第x位是0还是1
n: 0110101001 这里的二进制位只是进行了简写(n>>x)&1
解释:将这个数进行右移x位,此时将原本x位上的数字(0或1)右移到了最右边,然后和1进行按位与,如果结果为1的话,这个数的第x位上的数字就是1,反之就是0。
3.将一个数n的二进制表示的第x位修改成1
n: 0110101001n=n | (1<<x)
解释:将1进行左移x位到相应的位置,然后进行按位或,按位或的结果是有1就是1,如果都是0结果就是0,然后再将这个结果给赋值给n,这样就把n的第x位进行了修改。
4.将一个数的二进制表示的第x值修改成0
n: 0110101001n=n & (~ ( 1<<x ) )
解释:将1左移x位然后按位取反,再和n进行按位与,按位与保证的是n上除了第x位其他位不变。
5.提取一个数n二进制表示最右侧的1
n: 0000 0100 n为4-n的补码 : 1111 1100
n = n & (-n)
解释:-n的操纵就是将最右侧的1左边区域全部变成相反的。相反数之间差的一个符号位,但是在计算机中进行计算的是一个数的补码形式二进制,所以需要将一个负数二进制转换成补码形式。而补码是进行取反然后加1。而取反操作正好能将最右侧的1左边区域变成相反的,加1正好停留在最右侧1的位上。
6.干掉一个数n二进制表示中最右侧的1
n: 011010100n = n & ( n-1 )
解释:将最右侧的1,右边区域(包含1)全部变成相反。
7.异或运算的运算律
1. a ^ 0 = a 2. a ^ a = 0 3. a ^ b ^ c = a ^ ( b ^ c )8.对应的LeetCode题目练习
1.提取1和干掉1
1.位1的个数 [https://leetcode.cn/problems/number-of-1-bits/description/](https://leetcode.cn/problems/number-of-1-bits/description/)2.比较位计数 https://leetcode.cn/problems/counting-bits/description/
3.汉明距离 https://leetcode.cn/problems/hamming-distance/description/
2.异或练习
1.只出现一次的数字 [https://leetcode.cn/problems/single-number/description/](https://leetcode.cn/problems/single-number/description/)2.只出现一次的数字III https://leetcode.cn/problems/single-number-iii/description/