Очистить все, кроме самого значительного бита - PullRequest
0 голосов
/ 01 марта 2019

Для целого числа без знака j операция j&(-j) очищает все, кроме наименьшего значимого 1 бита, где -j является отрицательным значением j, рассматривая j как целое число со знаком,https://en.wikipedia.org/wiki/Find_first_set

Существует ли аналогичная простая операция, которая очищает все, кроме наиболее значимого 1 бита?

Очевидное решение заключается в использовании clz (подсчет ведущих нулей)операция, которая присутствует почти во всех современных процессорах.Существует также вопрос Предыдущее значение 2 с ответом, который, как говорят, работает даже быстрее, чем clz на старых процессорах AMD.См. Также Какой самый быстрый метод для вычисления числа, для которого задан только бит, который является самой значимой цифрой в другом номере?

Мой вопрос заключается в том, существует ли что-то более простое, чем использование clzкоторые не могут быть легко доступны на определенных языках.Обратите внимание, что мне нужен сам старший значащий 1 бит, а не его позиция (логарифм).

1 Ответ

0 голосов
/ 02 марта 2019

Для определения местоположения самой высокой «1» в слове я использую операцию сборки BSR:

static inline uint32_t bsr(uint32_t x) {
  uint32_t rc = 0;
  __asm__("bsr %1,%0":"=r" (rc):"rm" (x));
  return rc;
}

Возвращает позицию самой высокой «1».Например, bsr (5) == 2. если нужен этот код для 64-битного "x", используйте инструкцию bsrq .

...