Как найти битовую разницу между двумя числами в Javascript - PullRequest
0 голосов
/ 23 мая 2018

Предположим, у меня есть 2 числа, например, 1 и 2. Их двоичное представление равно '01' и '10', поэтому их разность битов равна 2. Для чисел 5 и 7 двоичное представление будет '101' и '111', поэтому битРазница составляет 1. Конечно, я могу преобразовать оба числа в двоичную, а затем зациклить его, чтобы найти разницу, но есть ли более простой способ .??

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Ах, строковый оператор - это простой способ сделать это в соответствии с ответом CertainPerformance, но здесь чисто побитовое решение.

Это плоский цикл, который обрабатывает ограниченную поддержку 32-битных int в JavaScript.

// implementation of the "bit population count" operation for 32-bit ints
function popcount(u) {
  // while I'm at it, why not break old IE support :)
  if ( !Number.isInteger(u) )
    throw new Error('Does not actually work with non-integer types.');
  // remove the above check for old IE support
  u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
  u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
  u = (u & 0x0f0f0f0f) + ((u >> 4) & 0x0f0f0f0f);
  u = (u & 0x00ff00ff) + ((u >> 8) & 0x00ff00ff);
  u = (u & 0x0000ffff) + ((u >>16) & 0x0000ffff);
  return u;
}

// select all bits different, count bits
function diffcount(a, b) {
  return popcount( a ^ b );
}

// powers of two are single bits; 128 is common, bits for 16, 32, and 8 are counted.
// 128+16 = 144, 128+32+8 = 168
console.log(diffcount(144,168)); // = 3
// -1 is 4294967295 (all bits set) unsigned
console.log(diffcount(-1,1)); // = 31
// arbitrary example
console.log(diffcount(27285120,31231992)); // = 14

Если вам нужны сколь угодно большие значения, дайте мне знать ...

Это потребует использования типизированных массивов, вышеуказанных функций ицикл.

0 голосов
/ 09 октября 2018

1) XOR на оба номера: x = a^b.

2) проверить, является ли результат XOR степенью 2. Если это степень 2, то разница будет только в 1 бит.(x && (!(x & (x - 1)))) должно быть 1

bool differAtOneBitPos(unsigned int a, 
                       unsigned int b) 
{ 
    return isPowerOfTwo(a ^ b); 
}

bool isPowerOfTwo(unsigned int x) 
{ 
    return x && (!(x & (x - 1))); 
} 
0 голосов
/ 23 мая 2018

Вы можете использовать битовое XOR (^) для определения позиций, биты которых различны, преобразовать результат в строку, а затем подсчитать количество вхождений 1 в строке:

const bitDiffCount = (a, b) => {
  const bitStr = ((a ^ b) >>> 0).toString(2);
  return bitStr.split('1').length - 1;
};

console.log(bitDiffCount(5, 7));
console.log(bitDiffCount(1, 2));
console.log(bitDiffCount(16, 16));
console.log(bitDiffCount(16, 17));
console.log(bitDiffCount(16, 18));
console.log(bitDiffCount(16, 19));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...