Какой самый эффективный способ получить позицию младшего значащего бита числа в javascript? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть несколько чисел, и мне нужно узнать, насколько они должны быть сдвинуты, чтобы их младший бит находился в позиции 0.

ex:
0x40000000 => 30, потому что 0x40000000 >> 30 = 1
768 = 512 + 256 => 8

Это работает

if (Math.log2(x) == 31)
  return 31;
if (Math.log2(x) > 31)
  x = x & 0x7FFFFFFF;
return Math.log2(x & -x)

Есть ли более эффективный или элегантный способ (встроенный?) Сделать это в javascript?

1 Ответ

2 голосов
/ 26 апреля 2020

Вы не можете получить этот результат немедленно с помощью встроенной функции , но вы можете избежать использования Math.log2. Есть малоизвестная функция Math.clz32, которая подсчитывает количество начальных нулей числа в своем 32-битном двоичном представлении. Используйте это так:

function countTrailingZeroes(n) {
    n |= 0; // Turn to 32 bit range
    return n ? 31 - Math.clz32(n & -n) : 0;
}

console.log(countTrailingZeroes(0b11100)); // 2

В троичном выражении есть значение n = 0, которое похоже на вырожденный случай: оно не имеет 1-битного значения.

...