2015-05-06 2 views
2

У меня есть массив целых чиселJavascript побитового сдвиг до 32 бит

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; 
} 

Но главная проблема в том, когда я Bitshift 255,0 < < 24, я получаю отрицательное число

255.0 << 24 = -16777216  

, который говорит мне, что я либо достиг предела бит или разрешения подписан. Я думал, что все побитовые операции в Javascript находятся на неподписанных 32-битных поплавках, поэтому не уверен, что здесь происходит. Помогите?

+0

«Я думал, что все битовые операции в JavaScript, находятся на беззнаковое 32 бит поплавки» - подписал 32-битные целые числа два дополнения https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators – jdphenix

ответ

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: не уверен, что если вещь как «без знака поплавка» даже существует где-то (по крайней мере для языков, реализующих IEEE754)

+1

Re, ваш PS, [Почему C не имеет неподписанных поплавков] (http://stackoverflow.com/вопросы/512022/почему-оленья кожа-с-у-неподписанные-поплавки). –

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 
+1

Или даже 'return res >>> 0;' – zerkms

+0

Ах да, еще лучше. Благодарю. –

Смежные вопросы