知识:
1.<<表示左移移,不分正负数,低位补0;
2.>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
3.>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
常用性质:
!!! 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
在使用位运算技巧解的算法题中,有以下这些常用的性质:
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a 与自身之间的操作
a & a = a
a | a = a
a ^ a = 0
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a 与 0 之间的操作
a & 0 = 0
a | 0 = a
a ^ 0 = a
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
按位与、按位或的还原计算
a | ( a & b ) = a
a & ( a | b ) = a
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
通过异或完成变量值交换
a ^= b
b ^= a
a ^= b
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
判断奇偶(通过 & 1 取出最后一个二进制位以达到模 2 的效果)
a & 1 === a % 2
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
比较两值是否相等(a ^ a === 0)
a ^ b === 0
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
将第 i + 1 个二进制位设为 1
a |= 1 << i
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
将第 i + 1 个二进制位设为 0
a &= ~(1 << i)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
取出第 i + 1 个二进制位上的数值
a & (1 << i)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在 a 第 i + 1 个二进制位,插入 b 对应位置的二进制位
a |= 1 << i
a & (b & 1 << i)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
删除二进制序列中最后一个值为 1 的位置
a &= (a - 1)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
计算 a 的相反数
-a === ~a + 1
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保留 a 在二进制位中最后一个 1
a &= (-a)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
生成二进制位全为 1 的数
~0
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保留 a 二进制序列中最后的 i - 1 位,其余补 0
a & ((1 << i) - 1)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
将 a 二进制序列中最后 i - 1 位全部置为 0
a & ~((1 << i) - 1)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
判断 a 的二进制序列最高位是否为 1
a < 0 # 最高位为 1 必然是负数
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在二进制序列中,仅保留最高位的 1,其他设为 0,输出该数
a = a | (a >> 1)
a = a | (a >> 2)
a = a | (a >> 4)
a = a | (a >> 8)
a = a | (a >> 16)
return (a + 1) >> 1
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||