Как найти число 1 в двоичном представлении числа?

#javascript #binary

#javascript #двоичный

Вопрос:

Из других поисковых запросов я обнаружил, что эта проблема называется «Вес Хэмминга» или «Количество населения». Есть много ответов, которые там даны с таким количеством статистики? Мне нужно найти решение простым способом? Сложность не имеет большого значения. Есть ли в JavaScript какая-либо встроенная функция, подобная Java Integer.bitCount?

В настоящее время я делаю это следующим образом.

 var binary = 3;
var original = binary;
var count = 0;
while(binary>0)
{
    binary = binary >> 1 << 1;
    if(original-binary==1)
        count  ;
    original = binary >> 1;
    binary = original;
}
  

Есть ли лучший, более простой и элегантный способ для этого?

Комментарии:

1. Если это действительно строка, str.split('1').length но это вообще не javascript, не так ли, это Java

2. связано с обзором кода ( codereview.stackexchange.com/questions )

3. @adeneo извините за неправильные данные. Мне нужно выполнить это для числа.

4. Тогда это numb.toString().split('1').length , тада!

5. Имеют ли вышеуказанные методы высокую временную сложность? Что я должен предпочесть?

Ответ №1:

попробуйте это

 var binary = 10;
var result = binary.toString(2); //Converts to binary
var count = result.split(1);//  count -1 is your answer
alert((result.split('1').length-1));
  

также может быть записано как

 (binary.toString(2).split('1').length-1)

toString(2)  : helps to split it in a base2 format which is binary, can do this in a range of 2- 36 (iam not sure about the range) 
  

Ответ №2:

Если вы хотите посчитать 1 цифру в двоичном представлении, мы можем использовать регулярное выражение, подобное этому.

number.toString(2).match(/1/g).длина

Ответ №3:

Простой способ без использования встроенных функций:

 function f(n){
    let i = 0;
    do if(namp;1)   i; while(n>>=1)
    return i;
}

// example:
console.log(f(7)); // 3
  

Ответ №4:

   function numOfOnes(n) {
    if(n === 0) return n;
    return (n amp; 1)   numOfOnes(n >>= 1);
  }
  

В основном этот подход относится к рекурсивному вызову.
У него есть базовое условие, когда нет числа для вычисления.
В противном случае он вызывает себя (n >>= 1) и добавляет последнюю цифру (n amp; 1) к результату.

например. 7 имеет двоичное представление 111 = 1 1 1 = 3
17 имеет двоичное представление 10001 = 1 0 0 0 1 = 2

Комментарии:

1. Хороший ответ, но объяснение того, как и почему это работает, сделало бы этот ответ отличным.

Ответ №5:

 function countOnesInDecimal(num) {
  let count = 0;
  let binary = num.toString(2);
  const splitted = binary.split('');
  for (const iterator of splitted) {
    if (iterator === `1`) {
      count  = 1;
    }
  }

  return count;
}
console.log(countOnesInDecimal(3));  

Комментарии:

1. нет необходимости разделять строку, вы можете так же легко выполнить итерацию по строке вместо массива