一、基础位运算
按位或: | 有1就是1
按位与: & 有0就是0
按位异或:^ 无进位相加(或相同为0,相异为1)
左移:<<
右移:>>
按位取反:~
二、给一个数n,确定它的二进制中的第x位是0还是1
将n右移x位,再按位与1,结果是1就为1,是0就为0,如图:
三、将一个数n的二进制表示的第x位修改成1
将1左移x位,在按位或1,如图:
四、将一个数n的二进制位表示的第x位修改成0
将1左移x位,再取反,取反后的结果按位于n,如图:
五、位图思想
类似hash表,让一个数的二进制为为1或者0进行标记,如图:
六、提取一个数(n)二进制表示中最右侧的1(lowbit)
n & (-n),负数的二进制位要按位取反后再+1,然后按位与上n,就能得到最右侧的1,如图:
七、干掉一个数n的最右侧的1
n & (n - 1),n-1能得到最右侧的1左边都为1,当前为0,再按位与上 n - 1,就能干掉最右侧的1,如图:
八、位运算的优先级
直接不管,想谁先算就把谁括号括起来。
九、异或运算的规律
n ^ 0 = n;任何与0异或的数等于它本身。
n ^ n = 0;自己和自己异或等于0。
a ^ b ^ c = b ^ c ^ a;满足交换律。
(a ^ b) ^ c = a ^ (b ^ c);满足结合率。