整数及其位运算

整数具有无限精度。有四种整数表示法:十六进制整数(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 "<ipython-input-44-95f378563ada>", 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。