如何从位运算符(1 << X)获得的数字中获取X(数字)

问题描述 投票:0回答:2

让我们说我有这样的设置

var num = 1 << 9 //equals 512
//OR
num = 1 << 6 //equals 64
//OR
num = 1 << 6 ^ 1 << 9 //equals 576
//OR
num = 1 << 6 ^ 1 << 9 ^ 1 << 1 ^ 1 << 8 //equals 834

我正在尝试取一个数字,例如说834,并通过一个函数将其取反,以获取当我将左移值(在本例中为834时,分别是6、9、1和8。

或,我想获取变量num并获取1 << X ^ 1 << X中的所有X值并将其转换为数组。

所以

var values = [0,1,2,3,6,7,8,9,10,12,14,16,17] //this can occur as X in 1 << X
function bitNumberToArray(bitNumber) {
var arr = [];
// what do I put here?
return arr;
}

console.log(bitNumberToArray(834))
//returns [1, 6, 8, 9] *ORDER DOESN'T MATTER*

[如果您对自己的工作感到好奇,那么我正在获取用户,然后获取其标志(只是位数字)并将其转换为用户友好的内容,例如This user is staff, holds badge X on Discord

我不知道从哪里开始,朝正确的方向轻推会有所帮助。

javascript bit-fields
2个回答
0
投票

您需要将数字转换为二进制,然后像这样收集所有正位的位置:

function bitNumberToArray(n) {
    const bits = [...n.toString(2)].map(Number);

    return bits.reduce((result, bit, index) => result.concat(bit ? bits.length - index - 1 : []), []);
}

测试:

const test = bitNumberToArray(834);
// returns [9, 8, 6, 1]

0
投票

这只是数字的二进制表示形式例如834,等于2 ^ 9 + 2 ^ 8 + 2 ^ 6 + 2

function getBinaryRepr(num){
  let repr = []
  while(num > 0){
    repr.push(num % 2) //Parity
    num = Math.floor(num/2) //Integer division
  }
  
  return repr //this is the binary representation of num
}

要从此处获取那些X:

getBinaryRepr(num).map((x,index) => x==0 ? x : index)

或更妙的是:

getBinaryRepr(num).map(x => x==0 ? x : 2^x)

然后简单地添加它们以获得号码

编辑:注意,现在您根本不需要0,所以:

getBinaryRepr(num).filter(x => x != 0).map((x,index) => x==0 ? x : index) //or x==1
© www.soinside.com 2019 - 2024. All rights reserved.