Python中进制转换与位操作
Python中的进制表示
计算机中的数都是使用二进制表示的,Python中数字加前缀$0b$,表示是二进制,类似的八进制和十六进制的前缀分别为 $0o$ 和 $0x$。
1 | 0b1 # 二进制表示的1 |
Python中的进制转换
Python中的进制转换函数
- int():其他进制转十进制
- bin():十进制转二进制
- oct():十进制转八进制
- hex():十进制转十六进制
其他进制转十进制
1 | int('011', 2) # 二进制转十进制(3) |
上述一定不要忘记加引号,因为二进制、八进制、十六进制都是一个字符串
- 十进制转其他进制
1 | bin(int('3',10)) # 十进制转二进制('0b11') |
Python中的位操作
Python中共有一下几种位操作:1
2
3
4
5
6x >> y # 返回 x 向右移 y 位得到的结果
x << y # 返回 x 向左移 y 位得到的结果
x & y # 且操作,返回结果的每一位是 x 和 y 中对应位做 and 运算的结果,只有 1 and 1 = 1,其他情况位0
x | y # 或操作,返回结果的每一位是 x 和 y 中对应位做 or 运算的结果,只有 0 or 0 = 0,其他情况位1
~x # 反转操作,对 x 求的每一位求补,只需记住结果是 -x - 1
x ^ y # 或非运算,如果 y 对应位是0,那么结果位取 x 的对应位,如果 y 对应位是1,取 x 对应位的补,当y位数不够时,从高位补零。
- 左移和右移操作
顾名思义,左移和右移的意思就是把位数整体向左或者向右移动若干位。比如1111向右移一位就变成了0111,原来没有的位自动填0,超出范围的位舍弃掉。1
2
3
40b1111 >> 1 == 0b111 == 7
0b1010 << 2 == 0b101000 == 40
0b111111 >> 3 == 0b111 == 7
0b1 << 4 == 0b10000 == 16
向右移1位可以看成除以2,向左移一位可以看成乘以2。移动n位可以看成乘以或者除以2的n次方。1
28 >> 2 == 8 / 2 / 2 == 0b1000 >> 2 == 0b10 == 2
8 << 2 == 8 * 2 * 2 == 0b1000 << 2 == 0b100000 == 32
- 且操作
对于单个位的且操:1
21 & 1 == 1
1 & 0 == 0 & 1 == 0 & 0 == 0
两个数字的且操作就是对每一位进行且操作取结果:1
2
30b1 & 0b0 == 0
0b1111 & 0b1010 == 0b1010 == 10
0b1010 & 0b1100 == 0b1000 == 8
- 或操作
对于单个位的或操作:1
21 | 0 == 0 | 1 == 1 | 1 == 1
0 | 0 == 0
两个数字的或操作就是对每一位进行或操作取结果:1
2
30b1 | 0b0 == 0b1 ==1
0b1000 | 0b0111 == 0b1111 == 15
0b1010 | 0b1100 == 0b1110 == 14
- 或非操作
对于 x ^ y,如果y的位是0,那么取x的原始值,如果y的位是1,那么取x此位的补:1
20b1111 ^ 0b0101 = 0b1010
0b1111 ^ 0b1 = 0b1110 # 自动填0
- 反转操作
python的反转操作只接受一个参数n,n必须是整数,效果是对n的内部表示的每一位求补,运算结果位$-n-1$:
~8 = -9
位操作的应用
持续更新中…