位运算
位运算是直接对二进制的每一位进行逻辑操作的运算方式
用途:位运算一般用于考察异或的性质、状态压缩、与位运算相关的特殊数据结构、构造题等。
基本的位运算共 6 种,分别为按位与、按位或、按位异或、按位取反、左移和右移。
按位与 &
两个数字与运算的结果不会变小
按位或 |
两个数字或运算的结果不会变小
异或 ^
两个数字进行异或运算,结果可能变大,也可能变小,也可能不变。
异或的性质
// 交换律
x ^ y = y ^ x
// 结合律
x ^ (y ^ z) = (x ^ y) ^ z
// 自反性
x ^ x = 0
// 零元素
x ^ 0 = x
// 逆运算
如果x ^ y = z,则有 z ^ y = x (两边同时异或 y)
按位取反
常用于无符号数,避免符号位取反造成干扰
位运算技巧
判断数字奇偶性
表达式:x&1
如果结果位1说明是奇数,结果为0说明是偶数
获取二进制的某一位
表达式:x >> i & 1
结果必然为 0 或 1,表示x中第 i 位的值
修改二进制某一位
修改二进制某一位为1
表达式:x | (1 << i)
将x的第i位或上1,则x第i位变为1,其他位不受影响
修改二进制某一位为0
表达式:x & ~(1 << i)
其中~
是按位非
判断一个数是否是2的幂次
表达式:x & (x - 1)
如果是2的幂次方,则其二进制中只有一个 1, x - 1
就会有很多连续的1并且与x
的1没有交集,两者与运算一定为0,其他情况必然不为 0 .
获取二进制中最低位的1
表达式 :lowbit(x) = x & -x
如果x=010010,则lowbit(x) = 000010
常用于数据结构树状数组