【问题标题】:Bitwise operations in JavaScriptJavaScript 中的按位运算
【发布时间】:2020-02-19 15:53:13
【问题描述】:

我知道 JavaScript 中的数字以 IEEE-754 格式存储。但是当我们使用整数,尤其是位运算符时,它们被表示为 32 位的二进制补码。

所以-1 将是0xFFFFFFFF。但是(-1).toString(2)-1-1 >>> 31 是 1,没错,但 -1 >>> 32 必须是 0,但它是 4294967295。而-1 << 32必须是0,但它是-1

为什么按位运算以这种方式工作?而toString() 显示带有符号- 的数字,为什么这个减号不在符号位?还有为什么-1 >> 0-1,而-1 >>> 04294967295?我知道>>>>>有什么区别,但是第二个操作数是0,所以我不明白为什么这些操作以不同的方式工作。

【问题讨论】:

标签: javascript bitwise-operators


【解决方案1】:

Difference between >>> and >>

在算术移位中,符号位被扩展以保留 号码的签名。

8 bit 中的-111111111 -211111110 ...

这样处理是因为如果你数到最大可能的数字+1,将显示可能的最小数字(8 bit: 01111111 +1 = 10000000),这就是为什么111111111-1

然而,逻辑右移并不关心该值是否可以 可能代表一个有符号数;它只是将所有内容移动到 右边,从左边用 0 填充。

所以在这里,-1 >>>11111111 推到右侧,这样“-”号就会丢失,并显示最大的正数0111111(在8 bit 中)

-1 >> 0 等于 -1 的原因也是因为 11111111 >> 0 确实没有添加任何内容,而 -1 >>> 0 仍然移动所有内容并用 0 填充左边的位,每一步你都会提高这个“0 " 将值减半直到 0。您可以尝试 -1 >>> 31 以查看它得到 1

【讨论】:

  • 是的,我知道。但是 -1 是 0xFFFFFFFF(或 32 1),所以 -1 >>> 32 应该是 0,不是吗?
  • 是的,当你 >>> 使用的位数时,它只是重新启动进程,就像它会再次 >>> 0,再次 33 一半等等
  • 哦,我明白了。所以当我们做任何 N 位移位并且 N >= 32 时,它会等于 (N % 32) 位移位?
  • 没错:)
  • 我不确定 JavaScript,但在 C 中,移位多于 CPU 寄存器大小的位是未定义的行为。由于 C 位移位指令转换为 CPU 汇编指令,因此它变得依赖于硬件。例如,Intel x86 shr / shl 指令在 32 位 CPU 上仅使用 5 个最低有效位参数,或在 64 位上使用 6 个 LSB。这就是为什么你会得到% 32 行为(2 ^ 5 = 32)。但是,这并不意味着其他 CPU(arm、ppc、mibs 等)也会这样做(也许他们会这样做,但不能保证)。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多