为什么4294967295>&燃气轮机;Javascript中的24==-1?

为什么4294967295>&燃气轮机;Javascript中的24==-1?,javascript,Javascript,我使用Javascript计算亮度时使用的是: luminosity = (5036060 * backgroundColor.red + 9886846 * backgroundColor.green + 1920103 * backgroundColor.blue) >> 24; 对于颜色为白色的情况,即所有3个RGB值均为255,我得到的结果为-1。我在Javascript中明确测试了值“4294967295>>24”为-1 为什么?JavaScript确实使用32位整数进行

我使用Javascript计算亮度时使用的是:

luminosity = (5036060 * backgroundColor.red + 9886846 * backgroundColor.green + 1920103 * backgroundColor.blue) >> 24;
对于颜色为白色的情况,即所有3个RGB值均为255,我得到的结果为-1。我在Javascript中明确测试了值“4294967295>>24”为-1


为什么?

JavaScript确实使用32位整数进行逐位运算。无符号值
+4294967295
对于有符号32位整数(一系列32位
1
)的表示方式与
-1
相同。如果使用运算符将其移位,它将被符号位填满,并且
-1>>x
始终以
-1
结束

请改用运算符:

4294967295 >>> 24 // 255

>
的定义如下:

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

生产移位表达式:移位表达式
>>
加法表达式 评估结果如下:

  • 设lref为计算移位压力的结果
  • 让lval成为(lref)
  • 设rref为计算AdditiveExpression的结果
  • 设rval为(rref)
  • 让lnum成为(lval)
  • 设rnum为(rval)
  • 设shiftCount是屏蔽除最低有效5位之外的所有rnum的结果,即计算rnum&0x1F
  • 返回通过移位计数位执行符号扩展lnum右移位的结果。最高有效位被传播。这个 结果是一个有符号32位整数
  • 然后像这样告诉32:

    ToInt32的抽象操作将其参数转换为232中的一个 范围内的整数值−231至231−1,包括在内。这 抽象操作功能如下:

  • 让number作为调用输入参数的结果
  • 如果数字为NaN+0−0+∞−∞,返回+0
  • 设posInt为(数)*((数))
  • 设INT32位为posInt 232;即,具有正号且大小小于232的数字类型的有限整数值k 使得posInt和k的数学差是 数学上是232的整数倍
  • 如果int32bit大于或等于231,则返回int32bit− 232,否则返回INT32位
  • 因此,
    ToInt32(4294967295)
    -1


    -1>>24
    -1

    为什么不将亮度计算为浮点值[0,1]?那么我应该进行除法?或者有更有效的方法吗?@DavidThielen:是的,
    Math.floor(x/(1>)
    当你想做整数魔术时。对于,我建议只使用浮点数学。我使用了上面提到的>>>24。谢谢!