整数及其位运算
整数具有无限精度。有四种整数表示法:十六进制整数(0x 或 0X 开头),十进制整数,八进制整数(0o 或 0O 开头)和二进制整数(0b 或 0B 开头)。
# 十六进制
0x10
16
# 十进制
10
10
# 八进制
0O10
8
# 二进制
0b10
2
数字之间或基数说明符(例如 0b)后,可以放一个下划线:
123_456_789
123456789
0b_1010
10
十进制整数不可以 0 开头:
012
File "", line 1
012
^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
整数类型按位运算
按位运算只对整数有意义。以优先级升序排序的按位运算:
- x | y x 和 y 按位 或 运算
- x ^ y x 和 y 按位 异或 运算
- x & y x 和 y 按位 与 运算
- x << n x 左移 n 位,相当于 x*2**n
- x >> n x 右移 n 位,相当于 x//(2**n)
- ~x x 逐位取反
下面以八位机为例,x 取 6,y 取 8,n 取 2:
6 和 8 在内存中的储存分别为 00000110,00001000。
按位 或 运算,规则如下:
0|0, 1|0, 1|1
(0, 1, 1)
6|8 逐位运算后结果为 00001110,十进制就是 14:
6|8, 0b00001110
(14, 14)
同理可按下列计算规则,计算出 6^8, 6&8:
0^0, 0^1, 1^1
(0, 1, 0)
0&0, 0&1, 1&1
(0, 0, 1)
6^8, 6&8
(14, 0)
6 左移 2 位结果为 00011000,十进制就是 24,相当于 6*2**2:
6<<2, 0b00011000, 6*2**2
(24, 24, 24)
同理可计算出 6>>2,结果为 1:
6>>2, 6//(2**2)
(1, 1)
6 逐位取反为 11111001,因为我们是以八位机来举例的,八位机中 11111001 表示 -7,这是个天才设计,正负整数计算可以利用一种电路即可完成,有兴趣的可以查资料了解详情。
~6
-7
例如 8 + (-7) 如此计算:
00001000
+ 11111001
=100000001
因为是八位机,结果有 9 位,所以第一个 1 溢出,结果就是 1。