var rgba = 0xFFFFFFFF;
console.log((rgba&0xFF000000)>>24);
上面的代码片段显示-1而不是255,这毫无意义。我知道JS中的数字是float64类型,因此您不能在某个点以上期望精确的二进制操作,但是这个点是否如此低,以至于您无法用一个数字表示RGBA通道?
var rgba = 0xFFFFFFFF;
console.log((rgba&0xFF000000)>>24);
这实际上不是精度问题。
在JavaScript中,位运算符会将其参数转换为32位有符号值。在32位有符号形式中,&ff000000是一个负数,因此当您进行移位时,从左侧进来的位是1而不是0(这是为了确保二进制补码负数在移位后仍然是负数)。如果您想要获取所需的行为,则可以在位移之后通过按位与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,所以在这种情况下你也可以使用它。维基百科将它们描述为“算术”和“逻辑”右移位。
0xFF000000 >>> 24 === 255
- Qantas 94 Heavy