我使用以下方法在Javascript中计算亮度:
luminosity = (5036060 * backgroundColor.red + 9886846 * backgroundColor.green + 1920103 * backgroundColor.blue) >> 24;
对于颜色为白色的情况,即所有3个RGB值都是255,我得到-1的结果。我明确地在Javascript中测试了值" 4294967295>> 24"是-1。
为什么?
答案 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 评估如下:
和ToInt32这样:
9.5 - ToInt32: (Signed 32 Bit Integer)
抽象操作ToInt32将其参数转换为2 32 中的一个 整数值在-2 31 到2 31 -1的范围内,包括端值。这个 抽象操作的功能如下:
因此,ToInt32(4294967295)
为-1
。
而-1 >> 24
是-1