Javascript 移位到 32 位
Javascript bit shift to 32 bits
我有一个整数数组
var ints = [R,B,G,A]
并且我想使用移位来获得 32 位表示
var thirtyTwo = AGBR
例如,
[255.0, 0.0, 0.0, 255.0] => 0xFF0000FF => 4278190335
我正在尝试通过循环和位移来完成此操作:
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;
}
但主要问题是当我对 255.0 << 24 进行位移时,我得到一个负数
255.0 << 24 = -16777216
这告诉我我达到了位限制或 res 已签名。我认为 Javascript 中的所有按位运算都是在无符号 32 位浮点数上进行的,所以不确定这里发生了什么。有帮助吗?
在 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 的语言而言)
<<
适用于带符号的 32 位整数,而 >>>
is 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
我有一个整数数组
var ints = [R,B,G,A]
并且我想使用移位来获得 32 位表示
var thirtyTwo = AGBR
例如,
[255.0, 0.0, 0.0, 255.0] => 0xFF0000FF => 4278190335
我正在尝试通过循环和位移来完成此操作:
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;
}
但主要问题是当我对 255.0 << 24 进行位移时,我得到一个负数
255.0 << 24 = -16777216
这告诉我我达到了位限制或 res 已签名。我认为 Javascript 中的所有按位运算都是在无符号 32 位浮点数上进行的,所以不确定这里发生了什么。有帮助吗?
在 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 的语言而言)
<<
适用于带符号的 32 位整数,而 >>>
is 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