JavaScript - 将整数转换为位数组

42

我正在尝试使用JavaScript将一个整数(我知道它将在0到32之间),转换为由0和1组成的数组。我查找了一些资料,但没有找到可行的方法。

因此,如果我有一个整数为22(二进制为10110),我希望可以按如下方式访问它:

Bitarr[0] = 0
Bitarr[1] = 1
Bitarr[2] = 1
Bitarr[3] = 0
Bitarr[4] = 1

有什么建议吗? 非常感谢


一个位数组不是一个字节。而一个由0和1组成的数组可能只是一个整数数组。 - GolezTrol
9个回答

82

转换为二进制:

var base2 = (yourNumber).toString(2);

访问字符(比特):

base2[0], base2[1], base2[3], etc...

4
太棒了,这个方法非常有效!我已经研究位移操作很长时间了,但这种方法要快得多。非常感谢!! - DimC
1
yourNumber 用括号括起来有什么作用?如果我运行 var base2 = 5.toString(2); 它不会起作用,所以我很好奇...谢谢! - Levi Mootz
1
如果你有整数文字,例如 21..toString(2),则不需要转换为数字对象。 - Cholthi Paul Ttiopic
5
需要注意的是,生成的字符串没有以前导零填充。例如,如果你想要一个有前导零的 8 位字符串,你可以使用("00000000" + number.toString(2)).slice(-8)。请注意,原文意思未变。 - Steven Rands
3
原始问题要求对拆分后的字符串进行从右到左的解析: var base2 = (yourNumber).toString(2).reverse() - Sideways S
显示剩余3条评论

13

短码(ES6)

填充最后几位为零的最短版本(32个字符)。我假设n是你的数字,b是输出位数(基数):

[...Array(b)].map((x,i)=>n>>i&1)

let bits = (n,b=32) => [...Array(b)].map((x,i)=>(n>>i)&1);

let Bitarr = bits(22,8);

console.log(Bitarr[0]); // = 0
console.log(Bitarr[1]); // = 1
console.log(Bitarr[2]); // = 1
console.log(Bitarr[3]); // = 0
console.log(Bitarr[4]); // = 1


10
var a = 22;
var b = [];

for (var i = 0; i < 5; i++)
  b[i] = (a >> i) & 1;

alert(b);
假定您的问题中提到的是5位(从您的问题中看起来是这样),所以 0 <= a < 32。如果您愿意,您可以将 5增加到最大值 32(在JavaScript中使用位移操作符时需要使用32位整数)。

3

这应该可以做到。

for(int i = 0; i < 32; ++i)
  Bitarr[i] = (my_int >> i) & 1;

3
您可以按照以下方式将整数转换为二进制字符串。请注意,需要使用基数2参数。
var i = 20;
var str = i.toString(2); // 10100

您可以像访问数组一样访问字符串中的字符:
alert(str[0]); // 1
alert(str[1]); // 0
etc...

2

在之前的答案基础上,你可能希望你的数组是整数类型而不是字符串类型,所以这里有一个一行代码:

(1234).toString(2).split('').map(function(s) { return parseInt(s); });

请注意,较短的版本(11).toString(2).split('').map(parseInt)无法工作(在chrome浏览器中),原因我不清楚,但它会将"0"转换为NaN。请使用以下代码替代:(11).toString(2).split('').map(Number)

2
map(parseInt) 不起作用,因为 Array.prototype.map() 为其回调函数提供了三个参数,其中第二个是数组的索引。 parseInt() 需要两个参数,其中第二个是进制。 - Alexander Gromnitsky
1
(11).toString(2).split('').map(val=>parseInt(val)) - HJ Cross
我刚刚使用了@HJCross的代码,从一个数字创建了一个位掩码值数组:(11).toString(2).split("").reverse().map((v, i) => (parseInt(v) ? Math.pow(2, i) : 0)).filter(v => v != 0) 返回 [1, 2, 8]。在这里似乎没有一种很好的方式来漂亮地格式化代码。我有什么遗漏吗? - Sideways S
位作为布尔值版本:(2).toString(2).padStart(8,0).split('').map(function(x){return (x == 1)}) 带填充。 - Karanko

1
你可以按照以下步骤进行;

var n = 1071,
    b = Array(Math.floor(Math.log2(n))+1).fill()
                                         .map((_,i,a) => n >> a.length-1-i & 1);
console.log(b);


这似乎对于比32位更大的数字不起作用,因为涉及到位运算。 - NullVoxPopuli

1

仅供参考:

(121231241).toString(2).split('').reverse().map((x, index) => x === '1' ? 1 << index : 0).reverse().filter(x => x > 0).join(' + ');

会给你:

67108864 + 33554432 + 16777216 + 2097152 + 1048576 + 524288 + 65536 + 32768 + 16384 + 4096 + 1024 + 512 + 256 + 128 + 8 + 1

1
此代码生成了一个长度为32的数组。
function get_bits(value){
        var base2_ = (value).toString(2).split("").reverse().join("");
        var baseL_ = new Array(32 - base2_.length).join("0");
        var base2 = base2_ + baseL_;
        return base2;
    }
1 => 1000000000000000000000000000000
2 => 0100000000000000000000000000000
3 => 1100000000000000000000000000000

这将生成长度为31的字符串。第三行应该是: var baseL_ = new Array(33 - base2_.length).join("0"); - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接