Javascript 这些右移操作员示例正确吗?
MDN上的右移操作员示例包括:Javascript 这些右移操作员示例正确吗?,javascript,Javascript,MDN上的右移操作员示例包括: 右移操作员;及 无符号右移运算符 只是对我来说没有意义。它们不仅挑战了我对两个补语的理解,还混淆了我对它们自身功能的认识。我是否遗漏了什么,或者这些示例是否需要更正 下面给出了一些令人困惑的例子,并对我的预期进行了评论 右移运算符为负数的示例如下: var条-5;//(-000000000000000000000000101) bar>>=2;//-2(-00000000000000000000000010) 首先,假设DWORD大小(32位,有符号),-5的两
var条-5;//(-000000000000000000000000101)
bar>>=2;//-2(-00000000000000000000000010)
首先,假设DWORD大小(32位,有符号),-5
的两个补码表示为11111111111 011
。我甚至不知道上面示例中提供的表示法(-00000000000000000000000101)
是什么意思
其次,如果我只是通过阅读示例来推断其含义,它可能会说:
取第一个操作数的正表示形式,将其右移第二个操作数位数,将其转换为十进制,然后对结果重新应用任何符号,无论是正符号还是负符号
然而,我也试过了,根据这个解释,结果应该是-1
,而不是-2
,如下所示
var条-5;//(-000000000000000000000000101)
bar>>=2;//-1(-00000000000000000000000000000001)
因此,为了测试该示例,我键入了以下JavaScript代码,并且lo!它产生了文档化的示例所声称的内容
console.log(5>>2)//产生-2
发生什么事了var bar=-5;//(-000000000000000000000000101)
bar>>>=2;//1073741822(00111111111111111110)
对于这一个,我唯一的抱怨是-5
的二进制表示是错误的。如果这一点得到纠正,那么这个例子就完全有意义了。正确的例子如下:
var bar=-5;//(11111111111111111111 011)
bar>>>=2;//1073741822(00111111111111111110)
如上所示,将11111111111111111111 011
右移两位将产生00111111111111111110
,这将产生正数1073741822
我试过了,它产生了正确的结果:
console.log(5>>2);//生成1073741822
我想这只是一个印刷错误-5
表示为…11111 011
(~4
)。将其向右移动两次,同时复制MSB以保留符号,将得到…11111110
(~1
),这是-2
的表示形式
2) 同样地,
-5
的二进制表示法是正确的,但没有用处,因为这不是计算机使用的表示法。对于人类数学,+5(10)
与+101(2)
相同,-5(10)
与-101(2)
相同;但是计算机分别将它们表示为…00000101
和…11111 011
。MDN提供的示例令人困惑,因为它们没有显示负数的真正二进制表示
-5
的二进制表示为111…11111 011
(用1
填充省略号,以达到32位的总长度)
>>
常规(也称为“符号传播移位”和)将位向右移位,丢弃最右边的位,并使用最左边位的值填充左侧新释放的位置
在二者的补码二进制表示法(现在大多数计算机都使用)中,最左边的位是符号位。正数为0
,负数为0
和1
-5
的二元补码表示为:
+---+---+---+---+---+----------+---+---+---+---+---+
| 1 | 1 | 1 | 1 | 1 | ........ | 1 | 1 | 0 | 1 | 1 |
+---+---+---+---+---+----------+---+---+---+---+---+
| | |
\------------------------------------/ ^ ^
^ these bits moves to the right +---+------ these 2 bits are discarded
|
+---- the value of this bit is used to fill the 2 leftmost freed positions
-5>>2
是111…11111110
,它是-2
的二进制表示形式
>>>
(也称为“零填充右移位”和)也将位向右移位并丢弃最右边的位,但它始终使用0
填充左侧的释放位置
-5>>2
是00111…11111110
这是正数1073741822
(=2^30-2
)请提供(1)的分步说明。如果保留MSB并向右移动2位,我将得到小数-66
。如何得到66?抱歉,这次我得到-98
。我将1111011
(-5以10为基数)向右移动了2个位置,但MSB除外。我得到了1001110
(-98base10)。它不是这样工作的。不复制MSB的右移(>
)只会从左侧引入一个0
:0b11111011>>2=0b00111110
。保留MSB的移位(>
)将MSB复制到下一个移位;因此(假设我们使用的是8位体系结构),您将得到0b11111011>>2=0b11111110
,而不是10011110
。也就是说,因为MSB是1
,>2
在前面引入了两个1
s,而不是两个0
s,就像>>2
一样。对于>
,您的意思是,除了保留MSB之外,它还将MSB中的内容复制到我们需要填充、填充的每个位置