Python: 为什么右移>>会向下取整,何时使用?

3 投票
5 回答
6492 浏览
提问于 2025-04-15 19:36

我从来没有用过 >><< 这两个运算符,不是因为我不需要它们,而是我不知道什么时候可以用,或者应该在哪里用。

100 >> 3 的结果是 12,而不是 12.5。这是为什么呢?也许学习如何正确使用右移运算符会隐含地解答这个问题,但我还是很好奇。

5 个回答

2

其他回答解释了位移的概念,但这里具体讲讲100>>3会发生什么。

100
128 64 32 16 8 4 2 1
  0  1  1  0 0 1 0 0 = 100
100 >> 1
128 64 32 16 8 4 2 1
  0  0  1  1 0 0 1 0  = 50
100 >> 2
128 64 32 16 8 4 2 1
  0  0 0  1  1 0 0 1  = 25
100 >> 3
128 64 32 16 8 4 2 1
  0  0  0  0 1 1 0 0  = 12

你不会经常需要用到位移,除非你需要非常快速地进行除以2的运算,但即便如此,也不要用它。这样会让代码变得比必要的复杂得多,而且速度上的差别几乎察觉不到。

你真正需要用到位移的情况,通常是在处理二进制数据时,特别是当你需要移动位的时候。我唯一真正用到它的情况是读取和写入ID3标签,这种标签用7位字节来存储大小信息,像这样:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx.

这些信息需要像这样组合在一起:

0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx

才能在内存中得到一个正常的整数。

4

>><< 分别是右移和左移的位运算符。你可以把它们想象成在数字的二进制表示上进行的操作。

>>> bin(100)
'0b1100100'
>>> bin(12)
'0b1100'
13

右移并不是除法

我们来看看右移到底是做什么的,这样就会明白了。

首先,记住一个数字在内存中是以二进制数字的形式存储的。如果我们有8位内存,可以用 00000010 来表示2,用 00000101 来表示5。

右移就是把这些数字向右移动。例如,把上面这两个数字右移一位,结果分别会变成 0000000100000010

注意,最右边的那个数字(最低位)会完全被移出,这对最终结果没有任何影响。

撰写回答