我有一系列的整数
.Value
我希望使用shift来获得32位表示
var ints = [R,B,G,A]
所以,例如,
var thirtyTwo = AGBR
我正在尝试使用循环和bitshift执行此操作:
[255.0, 0.0, 0.0, 255.0] => 0xFF0000FF => 4278190335
但主要问题是当我将255.0<< 24,我得到一个负数
function cArrayToABGR(va) {
var res = 0;
for (var i = 0; i < va.length; ++i) {
var color = va[i];
color <<= (8 * i);
res += color;
}
return res;
}
告诉我,我要么达到一定的限制,要么签署了res。我认为Javascript中的所有按位操作都是在无符号的32位浮点数上,所以不确定这里发生了什么。帮助
答案 0 :(得分:5)
在JS中,所有按位运算符都是32位符号,而结果是无符号32位。
作为一种解决方法,您可以将其计算为:
var res = ints.reduce(function(result, current) {
return result * 256 + current;
}, 0); // 4278190335
在ES2015中甚至更好:
var res = ints.reduce((result, current) => result * 256 + current, 0);
PS:不确定某个地方是否存在“unsigned float”之类的东西(至少对于实现IEEE754的语言而言)
答案 1 :(得分:2)
<<
适用于带符号的32位整数,而>>>
为unsigned,因此您可以使用>>> 0
来获取无符号整数:
(255 << 24) >>> 0 // 4278190080
<强>所以:强>
var ints = [255.0, 0.0, 0.0, 255.0];
function cArrayToABGR(va) {
var res = 0;
for (var i = 0; i < va.length; ++i) {
var color = va[i];
color <<= (8 * i);
res += color;
}
return res >>> 0;
}
console.log(cArrayToABGR(ints));
// 4278190335