基本运算
bin(num) #将十进制整数取二进制
a & b #位与,(5 & 9 = 1) => (0101 & 1001 = 0001)
a | b #位或,(5 | 9 = 13) => (0101 | 1001 = 1101)
a ^ b #位异或(半加),(5 ^ 9 = 12) => (0101 ^ 1001 = 1100)
~a #位取反 (~5 = -6) => (~1 0101 = 0 1010)
a << b #左移位(a乘以b个2) (5 << 2 = 20) => (101 << 2 = 10100)
a >> b #右移位(a除以b个2) (5 >> 2 = 1) => (101 >> 2 = 1)
常用算法
//交换两个变量
a ^= b
b ^= a
a ^= b
//java获取int最大值
(1 << 31) - 1
~(1 << 31)
//java获取int最小值
(1 << 31)
//判断一个数的奇偶性
(n & 1) == 1
//计算平均数
(x + y) >> 1
//取相反数
~n + 1
一些有趣的问题
判断是否为2的幂次:
2的幂次的二进制必然只有一个1,其余为0。将该值减去1,就会将原本是1的那位变成0。这个数按位与一定是0。
n > 0 && (n & (n - 1) == 0
计算在一个 32 位的整数的二进制表式中有多少个 1:
由x & (x - 1)消去x最后一位的1可知。不断使用 x & (x - 1) 消去x最后一位的1,计算总共消去了多少次即可。
def count(num):
cou = 0
while num != 0:
num = num & (num - 1)
cou += 1
return cou
数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数:
只要将所有数字异或起来,出现2次的数字不影响,留下只出现一次的数字
a ^ b ^ b = a //对一个数取两次异或会返回原值,也可用于加密
数组中,只有一个数出现一次,剩下都出现三次,找出出现一次的数
??????