为什么JavaScript在位运算中表现奇怪?

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

上面的代码片段显示-1而不是255,这毫无意义。我知道JS中的数字是float64类型,因此您不能在某个点以上期望精确的二进制操作,但是这个点是否如此低,以至于您无法用一个数字表示RGBA通道?

6
签名/无符号问题。我认为使用">>>"运算符可以使其无符号。 - Marvin Smit
@MarvinSmit:确实:0xFF000000 >>> 24 === 255 - Qantas 94 Heavy
哦,有趣,谢谢。在不破坏精度的情况下,我可以存储多大的数据量在单个数字中?(我刚刚测试了0xFF000000>>>32,但它不起作用!) - MaiaVictor
回答一下这个问题,我认为JavaScript的最大整数是多少?一个数字可以达到的最高整数值是多少? - Marvin Smit
@Roya。最高位表示正/负标志。0xFF00的ASR = 0x807F,0xFF00的LSR = 0x00FF。 - Marvin Smit
2
@Viclib,你可以在单个JavaScript数字变量中存储长达53位的整数而不会失去精度,但是你不能对它们进行位运算(如位移),因为位运算会转换为32位。 - kybernetikos
1个回答

2

这实际上不是精度问题。

在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,所以在这种情况下你也可以使用它。维基百科将它们描述为“算术”和“逻辑”右移位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接