bitwiseOR不返回正确的值

问题描述 投票:4回答:1

为什么bitwiseOR(|)在下列情况下应该是1410065407时返回== a && b - 考虑到javascript int精度是否准确到15个数字?

let a = 9999999999; // 10d
let b = 9999999999; // 10d
let c = a | b;
let d = b | a;

console.log({a,b,c,d});

// example 2

let a2 = 999999999; // 9d
let b2 = 999999999; // 9d
let c2 = a2 | b2;
let d2 = b2 | a2;

console.log({a2,b2,c2,d2});
javascript bit-manipulation
1个回答
5
投票

[...]考虑到javascript int precision精确到15个数字

不是数字而是32位。

值9,999,999,999高于完整的32位范围,即4,294,967,296(或2 ^ 32),所以会发生的情况是您将数字“转换”(钳位)到32位,这将在任何逐位运算中发生:

console.log(9999999999>>0);
console.log(9999999999&0xffffffff);
console.log(9999999999<<0);
console.log(9999999999|9999999999);
// etc.

那么所发生的是1)数字被钳位到32位范围,即在这种情况下为1,410,065,407:

Full range would require 34-bits:
  1001010100000010111110001111111111 -> 9,999,999,999

Actual result, max 32-bits:
  --01010100000010111110001111111111 -> 1,410,065,407

或者2)OR'ed在一起,这将产生相同的结果,因为两个数字首先被钳制。

在第二个例子中,数字999,999,999完全在32位范围内,因此无需钳位即可完成。

© www.soinside.com 2019 - 2024. All rights reserved.