Python: 为什么右移>>会向下取整,何时使用?
我从来没有用过 >>
和 <<
这两个运算符,不是因为我不需要它们,而是我不知道什么时候可以用,或者应该在哪里用。
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。
右移就是把这些数字向右移动。例如,把上面这两个数字右移一位,结果分别会变成 00000001
和 00000010
。
注意,最右边的那个数字(最低位)会完全被移出,这对最终结果没有任何影响。