为什么JavaScript会出现奇怪的按位运算行为?

时间:2013-11-24 13:20:18

标签: javascript binary bitwise-operators

var rgba = 0xFFFFFFFF;
console.log((rgba&0xFF000000)>>24);

上面的代码段显示-1而不是255,这没有任何意义。我知道JS数字是float64,因此你不能指望精确的二进制操作高于某一点,但是这一点是如此之低,你不能在一个数字中代表一个RGBA通道?

1 个答案:

答案 0 :(得分:2)

这实际上不是精确问题。

在javascript中,按位运算符将其参数转换为32位有符号值。在32位有符号格式中& ff000000是负数,所以当你移动它时,左边的位是1而不是0(这是为了确保移位后twos complement negative number仍为负值)。在位移之后,您仍然可以通过按位和使用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,所以在这种特殊情况下你也可以使用它。 Wikipedia describes them为'算术'和'逻辑'右移。