Python:为什么右移>>向下舍入,应该在哪里使用?

时间:2010-02-22 21:05:20

标签: python operators

我从未使用>><<运算符,不是因为我从来不需要它们,而是因为我不知道我是否可以使用它们,或者我应该拥有它们

100 >> 3输出12而不是12.5。为什么是这样。也许学习哪里最好使用右移会隐含地回答,但我很好奇。

5 个答案:

答案 0 :(得分:13)

右移是分区

让我们看一下right-shift 实际的作用,它会变得清晰。

首先,回想一下,一个数字作为二进制数字的集合存储在内存中。如果我们有8位内存,我们可以将2存储为00000010,将5存储为00000101

右移取这些数字并将它们移到右边。例如,将上面两位数字右移一次将分别给出0000000100000010

请注意,最低位( -most)完全偏离末尾,对最终结果没有影响。

答案 1 :(得分:4)

>><<分别是左右bit shift运算符。您应该查看数字的二进制表示。

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

答案 2 :(得分:2)

其他答案解释了位移的想法,但这里特别针对100&gt;&gt; 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分割,但即便如此,也不要使用它。它使得代码变得更加复杂,而速度差异并不明显。

您需要使用它的主要时间是,如果您正在使用二进制数据,并且您特别需要移动位。我唯一真正的用途是阅读&amp;编写ID3标签,以7位字节存储大小信息,如下所示:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx.

需要像这样放在一起:

0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx

在内存中给出一个正常的整数。

答案 3 :(得分:1)

移位整数会产生另一个整数。例如,数字12以二进制形式写为0b1100。如果我们向右移位1,我们得到0b110 = 6.如果我们将位移2,我们得到0b11 = 3.最后,如果我们将位移3,我们得到0b1 = 1而不是1.5。这是因为移位到寄存器之外的位丢失了。

一种简单的方法是将N向右移位与除以2 ^ N然后截断结果相同。

答案 4 :(得分:0)

我已经阅读了上面的答案,只是想添加一个我以前见过的更实际的例子。

让我们假设您要创建一个 2 的幂列表。因此,您可以使用左移来做到这一点:

fields = [{key:'a', width:12}, {key:'b', label:'2nd', width:15}, {key:'c', width:12}]
data = [{a:'a', b:'b', c:'c'},...]

// first add header info, then
worksheet.columns = fields
const titles = worksheet.addRow(this.fields.map(f => f.label || f.key))
// uncomment following line to freeze header and column title rows
// worksheet.views = [{state: 'frozen', ySplit: worksheet.lastRow._number}]
const dataRows = worksheet.addRows(data)

如果需要,您可以timeit,但我很确定,上面的代码是解决此问题的最快方法之一。但我不明白的是什么时候可以使用右移