2013-11-24 108 views
3
var rgba = 0xFFFFFFFF; 
console.log((rgba&0xFF000000)>>24); 

上面的代码片段显示-1而不是255,这没有任何意义。我知道JS数字是float64,因此你不能期望在某个点以上的精确二进制操作,但是这个点如此之低,你不能代表一个单一数字的RGBA通道?为什么JavaScript呈现按位操作的怪异行为?

+6

签署/未签名的问题。我认为使用“>>>”运算符没有签名。 –

+0

@MarvinSmit:确实:'0xFF000000 >>> 24 === 255' –

+0

哦,有趣的是,谢谢。我可以在不破坏精度的情况下将数据存储在单个数据中的大小限制是多少? (我刚刚测试0xFF000000 >>> 32),它不工作!) – MaiaVictor

回答

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; 

马文斯密特上面提到,>>>是无符号的右移总是拉动0,所以在这种特殊情况下,你可以使用了。 Wikipedia describes them为'算术'和'逻辑'右移。