我试图理解 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/