我从未使用>>
和<<
运算符,不是因为我从来不需要它们,而是因为我不知道我是否可以使用它们,或者我应该拥有它们
100 >> 3
输出12
而不是12.5
。为什么是这样。也许学习哪里最好使用右移会隐含地回答,但我很好奇。
答案 0 :(得分:13)
右移是不分区
让我们看一下right-shift 实际的作用,它会变得清晰。
首先,回想一下,一个数字作为二进制数字的集合存储在内存中。如果我们有8位内存,我们可以将2存储为00000010
,将5存储为00000101
。
右移取这些数字并将它们移到右边。例如,将上面两位数字右移一次将分别给出00000001
和00000010
。
请注意,最低位(右 -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,但我很确定,上面的代码是解决此问题的最快方法之一。但我不明白的是什么时候可以使用右移。