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

difference between Sign-propagating right shift and Zero-fill right shift in javascript?

本文关键字:右移 填充 之间 区别 符号 传播 JavaScript      更新时间:2023-09-26

据我所知,

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

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

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

例如:8>>2 返回 2.it 也重新调整相同。

那么>>运算符和>>>运算符有什么区别,为什么 JavaScript 有两个运算符而不是一个,或者如果我错了,那么请指导我获得正确的概念?

按位运算符假定其操作数是 32 位有符号整数。

以 2 为基数的00000000000000000000000000001000等于以 10 为基数的8


8 >> 2中,符号传播移位运算符(>>(将二进制数移位两位,保留符号(这是第一位(:

以 2 为底的00000000000000000000000000000010等于以 10 为基数的 2

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

以 2 为底的00000000000000000000000000000010等于以 10 为底的 2

它们是相同的,仅仅是因为正二进制数的第一个位是零。

来自MDN

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


然而,对于负数,情况看起来有所不同:

以 2 为底的11111111111111111111111111111000等于以 10 为基数的-8

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

以 2 为基数的11111111111111111111111111111110等于以 10 为基数的 -2

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

以 2 为底的00111111111111111111111111111110等于以 10 为基数的 1073741822