取第k位
a >> k&1
(k=0,1,2,3…)
>>> 8>>0&1
0
>>> 8>>1&1
0
>>> 8>>2&1
0
>>> 8>>3&1
1
将第k位清零
a &= ~(1<<k)
(k=0,1,2,3…)
>>> a = 15
>>> a&=~(1<<1)
>>> a
13
>>> a&=~(1<<0)
>>> a
12
从第k位开始将连续n位清零 a &= ~(2**n-1<<k)
(k=0,1,2,3…)
>>> a = 15
>>> a &= ~(2**4-1<<0)
>>> a
0
将第k位置1
a |= (1<<k)
(k=0,1,2,3…)
>>> a = 12
>>> a|=(1<<0)
>>> a|=(1<<1)
>>> a
15
从第k位开始将连续n位置1 a |= (2**n-1<<k)
(k=0,1,2,3…)
>>> a = 0
>>> a |= (2**4-1 << 0)
>>> a
15
将第k位取反
a ^= (1<<k)
(k=0,1,2,3…)
>>> a = 10
>>> a ^= (1<<3)
>>> a
2
从第k位开始将连续n位取反 a ^= (2**n-1<<k)
(k=0,1,2,3…)
>>> a = 9
>>> a ^= (3<<1)
>>> a
15
同或与异或
>>> int(not (1 ^ 1))
1
>>> int(not (1 ^ 0))
0
>>> int(not (0 ^ 0))
1
- 同或:相同为1
>>> 1 ^ 1
0
>>> 1 ^ 0
1
>>> 0 ^ 0
0
- 异或:不同为1
判断是奇数还是偶数
a & 1 = 1(奇数)
a & 1 = 0(偶数)
>>> a = 2
>>> a & 1
0
>>> a = 5
>>> a & 1
1
判断一个数是否为2的n次幂(n >= 0)
>>> 1 & (1 - 1)
0
>>> 2 & (2 - 1)
0
>>> 3 & (3 - 1)
2
>>> 4 & (4 - 1)
0
>>> 5 & (5 - 1)
4
数字加解密
>>> 1000 ^ 123456
123304
>>> 123304 ^ 123456
1000