Как получить X (число) из числа, созданного битовым оператором (1 << X) - PullRequest
1 голос
/ 05 мая 2020

Допустим, у меня есть что-то вроде этого

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 и получить все значения X в 1 << X ^ 1 << 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 на Discord

Понятия не имею, с чего начать, толчок в правильном направлении поможет.

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Вам нужно преобразовать ваше число в двоичное, а затем собрать позиции всех положительных битов следующим образом:

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]
1 голос
/ 05 мая 2020

вам нужно проверить побитовое И для каждого бита, например:

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) {
  return values.filter(bit => bitNumber & 1 << bit );
}

console.log(bitNumberToArray(834));
0 голосов
/ 05 мая 2020

Это просто двоичное представление числа 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
...