为什么 JavaScript 对按位运算呈现奇怪的行为

Why JavaScript presents weird behavior for bitwise operations?

本文关键字:JavaScript 运算 为什么      更新时间:2023-09-26
var rgba = 0xFFFFFFFF;
console.log((rgba&0xFF000000)>>24);

上面的代码段显示 -1 而不是 255,这毫无意义。我知道 JS 数字是 float64,因此你不能指望在某个点以上进行精确的二进制运算,但那个点太低了,你不能用一个数字表示 RGBA 通道吗?

这实际上不是一个精度问题。

在 javascript 中,按位运算符将其参数转换为 32 位有符号值。 在 32 位有符号形式中 &ff000000 是一个负数,所以当你移动它时,左侧的位是 1 而不是 0(这是为了确保 twos 补码负数在移位后保持负数(。 在位移之后,您仍然可以通过按位和0xff来获得所需的行为,如果您要拉出不同的颜色组件,这可能是最好的选择。

var rgba = 0xFFFFFFFF;
console.log((rgba>>24)&0xff);
var red = (rgba>>24) & 0xff;
var green = (rgba>>16) & 0xff;
var blue = (rgba>>8) & 0xff;
var alpha = rgba & 0xff;

正如 Marvin Smit 上面提到的,>>>是一个无符号的右移,总是拉入 0,所以在这种特定情况下,你也可以使用它。维基百科将它们描述为"算术"和"逻辑"右移。