Javascript位移到32位

Sha*_*arZ 2 javascript bit-manipulation

我有一系列的整数

var ints = [R,B,G,A]
Run Code Online (Sandbox Code Playgroud)

我想使用shift来获得32位表示

var thirtyTwo = AGBR
Run Code Online (Sandbox Code Playgroud)

例如,

[255.0, 0.0, 0.0, 255.0] => 0xFF0000FF => 4278190335
Run Code Online (Sandbox Code Playgroud)

我试图通过循环和bitshift来做到这一点:

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;
}
Run Code Online (Sandbox Code Playgroud)

但主要的问题是,当我将255.0移位到<< 24时,我得到一个负数

255.0 << 24 = -16777216    
Run Code Online (Sandbox Code Playgroud)

这告诉我,我要么有点限制,要么签署了res.我认为Javascript中的所有按位操作都是在无符号的32位浮点数上,所以不确定这里发生了什么.救命?

小智 6

<<适用于有符号的 32 位整数,而>>>is unsigned,因此您可以使用它>>> 0来获取无符号整数:

(255 << 24) >>> 0 // 4278190080
Run Code Online (Sandbox Code Playgroud)

所以:

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
Run Code Online (Sandbox Code Playgroud)

  • 甚至`return res &gt;&gt;&gt; 0;` (2认同)

zer*_*kms 5

在JS中,所有按位运算符都是32位符号,而结果是无符号32位.

作为一种解决方法,您可以将其计算为:

var res = ints.reduce(function(result, current) {
    return result * 256 + current;
}, 0); // 4278190335
Run Code Online (Sandbox Code Playgroud)

在ES2015中哪个更好:

var res = ints.reduce((result, current) => result * 256 + current, 0);
Run Code Online (Sandbox Code Playgroud)

PS:不确定某个地方是否存在"unsigned float"之类的东西(至少对于实现IEEE754的语言而言)