Zze*_*Zze 4 javascript bit-manipulation
为什么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});Run Code Online (Sandbox Code Playgroud)
小智 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.Run Code Online (Sandbox Code Playgroud)
那么所发生的是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
Run Code Online (Sandbox Code Playgroud)
或者2)OR'ed在一起,这将产生相同的结果,因为两个数字首先被钳制.
在第二个例子中,数字999,999,999完全在32位范围内,因此无需钳位即可完成.
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |