javascript中符号传播右移和零填充右移之间的区别?

时间:2015-03-29 18:55:29

标签: javascript

据我所知,

符号传播右移(a>> b):将二进制表示向左移位b位,丢弃已移位的位。

Ex:8>> 2将返回2.因为二进制1000将向右移动2次并返回0010。

零填充右移(a>>> b):将二进制表示向左移位b位,丢弃移位的位,并从左移零。

Ex:8>> 2返回2.it也重新调整。

那么>>>>>运算符之间有什么区别?为什么javascript有这两个运算符而不是一个或者如果我错了那么请指导我做正确的概念?

1 个答案:

答案 0 :(得分:7)

按位运算符假设它们的操作数是32位有符号整数。

基数2中的

00000000000000000000000000001000等于基数10中的8

<小时/> 在8 >> 2中,符号传播的右移运算符(&gt;&gt;)将二进制数移位两位,保留符号(这是第一位):

基数2中的

00000000000000000000000000000010等于基数10中的2

8 >>> 2中,零填充右移运算符(&gt;&gt;&gt;)将二进制数移位两位,用0填充左位:

基数2中的

00000000000000000000000000000010等于基数10中的2

这些是相同的,只是因为正二进制数的第一位是零。

来自 MDN

  

对于非负数,零填充右移和符号传播   右移产生相同的结果。


但是对于负数,事情看起来不同:

基数2中的

11111111111111111111111111111000等于基数10中的-8

-8 >> 2中,符号传播右移运算符(&gt;&gt;)将二进制数转移两位,保留符号:

基数2中的

11111111111111111111111111111110等于基数10中的-2

-8 >>> 2中,零填充右移运算符(&gt;&gt;&gt;)将二进制数移位两位,用0填充左位:

基数2中的

00111111111111111111111111111110等于基数10中的1073741822