位运算符
- 异或
按位异或可以实现无进位相加,所谓无进位相加,就是在不考虑进位
的情况下将两个数相加(后面有道题需要用到这种操作)
异或的运算律
①a ^ 0 = a
②a ^ a = 0
③a ^ b ^ c = a ^ ( b ^ c )
- 有符号右移
>>
将一个数的所有位向右移动指定的位数,最高位用符号位填充 - 无符号右移
>>>
也是右移,不过最高位用0填充
基操
背景:给一个数 n,我们设它二进制表示的最低位的下标是 0
-
确定 n 二进制表示的第 x 位是0还是1
将 n 右移 x 位,然后和 1 按位与,若为 0,则第 x 位为0;反之为 1 -
将 n 的第 x 位修改成 1
将 1 左移 x 位,然后和 n 按位或 -
将 n 的第 x 位修改成 0
将 1 左移 x 位,然后和 n 按位异或
lowbit:提取一个数二进制中最右侧的1
这是一个很巧妙的操作,本质是将最右侧的 1 左边的区域全变成相反
操作:n ^ (-n)
去除最右侧的1
操作:n & ( n - 1 )
本质:将最右侧的1右侧的区域(包括1)全部变成相反