Как посчитать 1 бит в целом числе в JavaScript - PullRequest
0 голосов
/ 24 августа 2018

Как посчитать количество 1 бит в целом числе.

Допустим, у вас есть двоичное число 11100000. По сути, в начале есть 3 логических флага. Соответствующая десятичная запись для этого - 224. Хотите знать, как взять это целое число и каким-то образом пройти через него, чтобы добавить число 1, с которого оно начинается. Как то так:

var int = 224
var n = 8
var i = 0
var total = 0
while (i++ < n) {
  if (int.getBitAt(i) == 1) {
    total++
  } else {
    break
  }
}

Я никогда не имел дело с битами, поэтому не уверен, как это сделать оптимальным образом (т.е. без преобразования его в строку '11100000' или другими неоптимальными способами.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Способ сделать это для произвольных чисел битовой длины может быть что-то вроде:

function countBits(num){
    var s=num.toString(2); //Converts the number to a binary string
    if (s[0]==='0'){return 0;} //If the first digit is 0, return 0
    return s.split('0')[0].length; //Otherwise, return the number of 1s at the start
}
0 голосов
/ 24 августа 2018

Итак, вот еще одно решение с произвольной длиной в битах с использованием битовой перестановки:

function countBits(num){
    var idx=Math.floor(Math.log2(num)); //Get the number of bits needed to represent your number
    var bit=1;
    var count=0;
    while (bit){
        bit=(num & (1<<idx))>>idx; //Check the bit value in the given position
        count+=bit; //Add it to the count
        idx-=1; //Check the next bit over
    }
    return count;
}
0 голосов
/ 24 августа 2018

Самый простой способ получить такую ​​вещь - использовать побитовые операторы. В основном:

var int = 224
var n = 8
var i = 0
var total = 0
while (i++ < n) {
  var mask = 1 << i
  if ( (mask & int) == (mask)) {
    total++
  }
}

В основном mask - это переменная, равная 1 в одном месте и 0 во всех других местах, например 0001000 со старшим битом в позиции i.

mask & int - все ноль, если i бит целого числа равен 0, равно маске, если оно равно 1.

РЕДАКТИРОВАТЬ: я дал несколько попыток на консоли. Прежде всего я избавился от разрыва, затем добавил несколько скобок в операторе if. Вероятно, некоторые проблемы с представлением чисел сделали невозможным утверждение, чтобы оно было верным.

...