簡體   English   中英

Javascript位移到32位

[英]Javascript bit shift to 32 bits

我有一系列的整數

var ints = [R,B,G,A]

我想使用shift來獲得32位表示

var thirtyTwo = AGBR

例如,

[255.0, 0.0, 0.0, 255.0] => 0xFF0000FF => 4278190335

我試圖通過循環和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;
}

但主要的問題是,當我將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位整數,而>>>無符號的 ,因此可以使用>>> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM