为什么按位运算符 OR 会截断此示例中的值?

gnz*_*nzg 3 javascript bit-manipulation bitwise-operators

Mozilla JavaScript 指南对于按位 OR 运算符是这样说的:

“按位或:在两个操作数的相应位均为零的每个位位置返回零。”

但是,当操作数 b 为 1 时,下例中的按位运算符 OR 将向上舍入a。这是我无法理解的事情。另外,由于a返回一个非四舍五入的数字,我也不清楚按位运算符如何将其截断为两位数。

var a = Math.random()*100;
console.log(a);
console.log(a | 1);
Run Code Online (Sandbox Code Playgroud)

非常欢迎有见地的解释。

Jam*_*unt 5

这里隐藏的因素是按位运算符在应用之前将数字转换为整数。这就是数字四舍五入的原因。转换会截断任何小数部分。

然后,按位或本身只是将第一位设置为 1。因此,可能会或可能不会将截断的数字加 1,具体取决于截断后它是奇数还是偶数。

因此,它并不是在所有情况下都进行四舍五入——只是 50% 的情况下进行四舍五入。