为什么4294967295>> 24 == -1在Javascript中?

时间:2015-03-24 18:16:35

标签: javascript

我使用以下方法在Javascript中计算亮度:

luminosity = (5036060 * backgroundColor.red + 9886846 * backgroundColor.green + 1920103 * backgroundColor.blue) >> 24;

对于颜色为白色的情况,即所有3个RGB值都是255,我得到-1的结果。我明确地在Javascript中测试了值" 4294967295>> 24"是-1。

为什么?

2 个答案:

答案 0 :(得分:9)

JavaScript确实使用32位整数进行按位运算。对于带符号的32位整数,无符号值+4294967295-1具有相同的表示形式 - 一系列32 1 - 位。如果您使用signed right shift运算符进行移位,则会使用符号位填充,-1 >> x始终以-1结束。

请改用unsigned right shift运算符:

4294967295 >>> 24 // 255

答案 1 :(得分:0)

>>的定义如下:

  

11.7.2 - The Signed Right Shift Operator ( >> )

     

在左侧执行符号填充按位右移操作   操作数由右操作数指定的数量。

     

生产 ShiftExpression ShiftExpression >> AdditiveExpression   评估如下:

     
      
  1. lref 成为评估 ShiftExpression 的结果。
  2.   
  3. lval GetValue lref )。
  4.   
  5. rref 成为评估 AdditiveExpression 的结果。
  6.   
  7. rval GetValue rref )。
  8.   
  9. lnum ToInt32 lval )。
  10.   
  11. rnum ToUint32 rval )。
  12.   
  13. shiftCount 成为屏蔽除 rnum 之外的所有但最不重要的5位的结果,即计算 rnum &为0x1F。
  14.   
  15. 返回 shiftCount 位执行 lnum 符号扩展右移的结果。传播最重要的位。该   result是带符号的32位整数。
  16.   

和ToInt32这样:

  

9.5 - ToInt32: (Signed 32 Bit Integer)

     

抽象操作ToInt32将其参数转换为2 32 中的一个   整数值在-2 31 到2 31 -1的范围内,包括端值。这个   抽象操作的功能如下:

     
      
  1. number 成为输入参数调用ToNumber的结果。
  2.   
  3. 如果数字 NaN + 0 -0 +∞-∞,返回 +0
  4.   
  5. posInt sign数字)* floorabs数字) )。
  6.   
  7. int32bit 为posInt modulo 2 32 ;也就是说,数字类型的有限整数值k具有正号并且在数量上小于2 32   这样 posInt 和k的数学差异就是   数学上是2 32 的整数倍。
  8.   
  9. 如果 int32bit 大于或等于2 31 ,则返回 int32bit - 2 32 ,否则返回 int32bit
  10.   

因此,ToInt32(4294967295)-1

-1 >> 24-1