Python中的进制表示

计算机中的数都是使用二进制表示的,Python中数字加前缀$0b$,表示是二进制,类似的八进制和十六进制的前缀分别为 $0o$ 和 $0x$。

1
2
3
4
5
6
7
0b1 # 二进制表示的1
0b10 # 二进制表示的2
0b1111 # 二进制表示的15
0o10 # 八进制表示的8
0o17 # 八进制表示的15
0x10 # 十六进制表示的16
0xff # 十六进制表示的255

Python中的进制转换

  1. Python中的进制转换函数

    • int():其他进制转十进制
    • bin():十进制转二进制
    • oct():十进制转八进制
    • hex():十进制转十六进制
  2. 其他进制转十进制

1
2
3
int('011', 2) # 二进制转十进制(3)
int('050', 8) # 八进制转十进制(40)
int('0x4', 16) # 十六进制转十进制(4)

上述一定不要忘记加引号,因为二进制、八进制、十六进制都是一个字符串

  1. 十进制转其他进制
1
2
3
4
5
6
bin(int('3',10)) # 十进制转二进制('0b11')
bin(3) # 十进制转二进制('0b11')
oct(int('3',10)) # 十进制转二进制('0o3')
oct(3) # 十进制转八进制('0o3')
hex(int('3',10)) # 十进制转二进制('0x3')
hex(3) # 十进制转十六进制('0x3')

Python中的位操作

Python中共有一下几种位操作:

1
2
3
4
5
6
x >> 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位数不够时,从高位补零。

  1. 左移和右移操作

顾名思义,左移和右移的意思就是把位数整体向左或者向右移动若干位。比如1111向右移一位就变成了0111,原来没有的位自动填0,超出范围的位舍弃掉。

1
2
3
4
0b1111 >> 1 == 0b111 == 7
0b1010 << 2 == 0b101000 == 40
0b111111 >> 3 == 0b111 == 7
0b1 << 4 == 0b10000 == 16

向右移1位可以看成除以2,向左移一位可以看成乘以2。移动n位可以看成乘以或者除以2的n次方。

1
2
8 >> 2 == 8 / 2 / 2 == 0b1000 >> 2 == 0b10 == 2
8 << 2 == 8 * 2 * 2 == 0b1000 << 2 == 0b100000 == 32

  1. 且操作

对于单个位的且操:

1
2
1 & 1 == 1
1 & 0 == 0 & 1 == 0 & 0 == 0

两个数字的且操作就是对每一位进行且操作取结果:

1
2
3
0b1 & 0b0 == 0
0b1111 & 0b1010 == 0b1010 == 10
0b1010 & 0b1100 == 0b1000 == 8

  1. 或操作

对于单个位的或操作:

1
2
1 | 0 == 0 | 1 == 1 | 1 == 1
0 | 0 == 0

两个数字的或操作就是对每一位进行或操作取结果:

1
2
3
0b1 | 0b0 == 0b1 ==1
0b1000 | 0b0111 == 0b1111 == 15
0b1010 | 0b1100 == 0b1110 == 14

  1. 或非操作

对于 x ^ y,如果y的位是0,那么取x的原始值,如果y的位是1,那么取x此位的补:

1
2
0b1111 ^ 0b0101 = 0b1010
0b1111 ^ 0b1 = 0b1110 # 自动填0

  1. 反转操作

python的反转操作只接受一个参数n,n必须是整数,效果是对n的内部表示的每一位求补,运算结果位$-n-1$:

~8 = -9

位操作的应用

持续更新中…