Javascript - 将整数转换为位数组

Posted

技术标签:

【中文标题】Javascript - 将整数转换为位数组【英文标题】:Javascript - convert integer to array of bits 【发布时间】:2012-04-14 20:01:09 【问题描述】:

我正在尝试在 javascript 中将整数(我知道它将在 0 到 32 之间)转换为 0 和 1 的数组。我环顾四周,但找不到有用的东西..

所以,如果我有一个整数 22(二进制 10110),我想访问它:

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

有什么建议吗? 非常感谢

【问题讨论】:

位数组不是字节。一个 0 和 1 的数组可能只是一个 int 数组。 【参考方案1】:

转换为基数 2:

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

访问字符(位):

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

【讨论】:

太棒了,效果很好!我一直在研究位移操作,但这要快得多。非常感谢!! yourNumber 括在括号里有什么作用?如果我运行var base2 = 5.toString(2); 它将不起作用,所以我很好奇...谢谢! 如果你有整数文字,例如你可以21..toString(2)。无需转换为 Number 对象。 应该注意的是,结果字符串没有用前导零填充。例如,如果您想要一个带有前导零的 8 位字符串,您可以使用 ("00000000" + number.toString(2)).slice(-8) 原题要求从右到左解析分割字符串:var base2 = (yourNumber).toString(2).reverse()【参考方案2】:
var a = 22;
var b = [];

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

alert(b);

假设 5 位(从您的问题看来),所以 0 &lt;= a &lt; 32。如果您愿意,可以将5 增大到32(JavaScript 中的位移适用于 32 位整数)。

【讨论】:

【参考方案3】:

最短(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

【讨论】:

【参考方案4】:

应该这样做

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

【讨论】:

【参考方案5】:

您可以像这样将整数转换为二进制字符串。注意 base 2 参数。

var i = 20;
var str = i.toString(2); // 10100

您可以像访问数组一样访问字符串中的字符:

alert(str[0]); // 1
alert(str[1]); // 0
etc...

【讨论】:

【参考方案6】:

基于之前的答案:您可能希望您的数组是一个整数数组,而不是字符串,所以这里是一个单行:

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

请注意,较短的版本 (11).toString(2).split('').map(parseInt) 将不起作用(chrome),我不知道为什么它会将 "0"s 转换为 NaNs

【讨论】:

map(parseInt) 不起作用,因为Array.prototype.map() 为其回调提供了 3 个参数,其中第二个是数组 indexparseInt() 需要 2 个参数,其中第二个是 radix (11).toString(2).split('').map(val=&gt;parseInt(val)) 我刚刚使用@HJCross 代码从一个数字创建位掩码值数组:(11).toString(2).split("").reverse().map((v, i) =&gt; (parseInt(v) ? Math.pow(2, i) : 0)).filter(v =&gt; v != 0) 返回 [1, 2, 8]。这里似乎没有办法在 cmets 中很好地格式化代码。我错过了什么吗? bits as bools version: (2).toString(2).padStart(8,0).split('').map(function(x)return (x == 1)) with padding【参考方案7】:

另外,这段代码给出了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");【参考方案8】:

你可以这样做;

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 位的数字【参考方案9】:

仅供参考:

(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

【讨论】:

以上是关于Javascript - 将整数转换为位数组的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为位数组问题

将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针

Javascript如何将十进制数转换为具有特定小数位数的字符串

C语言:用递归法讲一个整数n转换成字符串。例如输入483,应输出字符串“483”,n的位数不定,为任意位数整

python 将一个转换为一个位数组字符串,看看你在python中的位操作中做了什么。

python 将一个转换为一个位数组字符串,看看你在python中的位操作中做了什么。