Javascript 32 位数字和运算符 & 和 >>>

标签 javascript numbers

我试图理解 JavaScript 逻辑运算符,并遇到了 2 个具有看似相似功能的语句,并试图理解其中的差异。那么,Javascript 中的这两行代码有什么区别呢? 对于数字 x,

x >>>= 0;
x &= 0x7fffffff;

如果我理解正确的话,它们都应该给出无符号的 32 位输出。然而,对于相同的 x 负值(即两种情况下最高有效位始终为 1),我得到不同的输出,我错过了什么?

谢谢

最佳答案

要将数字 chop 为 32 位,最简单且最常用的方法是使用“|”按位运算符:

x |= 0;

如果设置了最高位(位 31),JavaScript 始终将任何 32 位计算的结果视为负数。别让这困扰你。并且不要清除位 31 试图使其为正;错误地改变了值。

要将负 32 位数字转换为正值(0 到 4294967295 范围内的值),您可以执行以下操作:

x = x < 0? x + 0x100000000 : x;

通过添加 33 位值,将禁止第 31 位的自动符号扩展。但是,结果现在超出了带符号的 32 位范围。

另一个(更简洁的)解决方案是使用移位计数为零的无符号右移运算符:

x >>>= 0;

从技术上讲,所有 JavaScript 数字都是 64 位浮点值,但实际上,只要将数字保持在带符号的 32 位范围内,JavaScript 运行时就可以使用 32 位来优化代码整数运算。

请注意,当您使用上述任一方法将负 32 位值转换为正值时,您实际上已经生成了一个 33 位值,这可能会破坏您的 JavaScript 引擎使用的任何 32 位优化。

关于Javascript 32 位数字和运算符 & 和 >>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281617/

相关文章:

ios - 将正数转换为负数 - iOS

java - 带数字键盘的按键监听器?

c# - 获取在数组中的文本框中输入的数字

javascript - React JS Ajax 数据循环

javascript - 为什么这个 JavaScript 可以在 Safari 上运行,但不能在 Firefox 上运行?

javascript - 使用 javascript 检索文件的完整路径

python - 为什么不能使用 "is"来比较数字?

javascript - onclick 刷新但不是从缓存中刷新?

javascript - Google Analytics 使用什么来跟踪用户事件?

Python:如何格式化固定宽度的数字?