![](/img/trans.png)
[英]How to do an 8-bit, 16-bit, and 32-bit Linear-Feedback Shift Register PRNG in JavaScript?
[英]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.