按位运算 - 零填充右移(>>>)用法?

时间:2013-09-29 12:10:30

标签: javascript binary bit-manipulation

一般来说,位移(>> , <<)允许我们除以^2

示例:

      9 (base 10): 00000000000000000000000000001001 (base 2)
                   --------------------------------
 9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) 

= 2(基数10)

对于否定号码:

同样,-9 >> 2会产生-3,因为符号会被保留:

     -9 (base 10): 11111111111111111111111111110111 (base 2)
                   --------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)

但是看>>>对于正数的行为是相同的,但是对于负数,行为却不同:

mdn

  

位从左侧移入

我找不到任何理由/用法从左侧移动0(这使得整个数字为正)从左边开始:

       -9 (base 10): 11111111111111111111111111110111 (base 2)
                     --------------------------------
 -9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)

问题:

我应该在什么情况下使用>>>?我不明白为什么我要从左边填零,弄乱我的负数。

2 个答案:

答案 0 :(得分:3)

假设你正在编写一些模仿硬件的东西,特别是shift register

为了方便起见,我将使用8位而不是32位,如你的问题所示。

每次我们想要将高位馈入此移位寄存器时,我们可以添加128,因为它会使最左边的位为1。

// Assume n is initialised to 0, so n = 00000000 in binary
n += 128;                    // now n = 10000000 in binary

如果我们使用&gt;&gt;&gt;进行转换每次你想要模拟一个时钟周期,那么在8个“时钟周期”之后,我们将在最右边的位置得到1。如果我们读出最右边的位,那么我们将获得8个周期前最左边位的延迟版本。


这只是一个例子,其中的位不被解释为数字,我相信还有更多。我想你会在其他地方找到更多用途,特别是用于模仿硬件电路/构建模块的软件。

答案 1 :(得分:2)

一个简单且经常使用的情况是将变量转换为32位无符号整数(UInt32)。当你做变量&gt;&gt;&gt; 0,如果变量已经是UInt32,变量将保持不变,如果不是,则变量为0。 e.g。

enter image description here

使用示例:

function convert( arrayLikeVariable){
   // we dont know for sure if length is UInt32
   // e.g. arrayLikeVariable.length = "zavarakatranemia"
   // so we do >>> 0
   var len = arrayLikeVariable >>> 0 
   // Now len is UInt32 for sure. 
   [..]
   // code using the len
}

如果您想要一个完整的示例,请在此处查看Polyfill:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach