为什么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 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位范围内,因此无需钳位即可完成。