gpt4 book ai didi

JavaScript 按位 & 运算符在意外位置附加 1

转载 作者:行者123 更新时间:2023-12-04 00:18:20 25 4
gpt4 key购买 nike

当我在 javascript 上运行 0x00000000C17E000F & 0x00000000C17E0000 时,它返回 -1048707072 而不是 3246260224

每个的二进制是

  • 0x00000000C17E000F:(省略 32 个 0)1100 0001 0111 1110 0000 0000 0000 1111
  • 0x00000000C17E0000:(省略 32 个 0)1100 0001 0111 1110 0000 0000 0000 0000

所以我预计 0x00000000C17E000F & 0x00000000C17E0000 的结果为 3246260224,但结果为 -1048707072

  • 3246260224:(0 中的 32 个省略)1100 0001 0111 1110 0000 0000 0000 0000
  • -1048707072 :(省略了 1 中的 32 个)1100 0001 0111 1110 0000 0000 0000 0000

为什么 Javascript 将 0 & 0 计算为 1 在那里(第 33 到 64 位)?

(听说Javascript Number是64位的。)

最佳答案

来自 the MDN on bitwise operators :

The operands are converted to 32-bit integers and expressed by a series of bits (zeroes and ones). Numbers with more than 32 bits get their most significant bits discarded.

您的数字不在 -2 ^ 31 和 2 ^ 31 之间,因此它们会因转换而改变。

请注意,这并不是真正的溢出,也不是存储限制:Javascript 中的数字是 64 位(IEEE754 double ),这意味着它们可以存储 - 2 ^53 和 2 ^53 之间的所有整数。 32 位的限制只是按位运算符的设计。

这句话的结果是你可以很好地设计你自己的函数来对更大的整数进行按位运算:

function and(a, b){
let abits = Array.from(a.toString(2));
let bbits = Array.from(b.toString(2));
return parseInt(abits.map((abit, i)=>abit & bbits[i]).join(""), 2);
}
console.log(and(0x00000000C17E000F, 0x00000000C17E0000)); // 3246260224

关于JavaScript 按位 & 运算符在意外位置附加 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com