Инструкция по набору первого набора (ffs) для надстройки multiprecision uint512_t - PullRequest
2 голосов
/ 02 октября 2019

Я разрабатываю алгоритм, который использует __builtin_ffsll() с типом uint64_t.

Я хочу переключиться на 512-битное поле, используя библиотеку boost multiprecision (я работаю на машине с поддержкой avx512).

Существует ли функция, аналогичная упомянутой встроенной функции? В качестве альтернативы, как я могу эффективно реализовать такую ​​функциональность для 512-битных целых чисел?

1 Ответ

2 голосов
/ 03 октября 2019

С документация :

unsigned lsb(const number-or-expression-template-type& x);

Возвращает (основанный на нуле) индекс младшего значащего бита, который установлен в 1.

Выдает std::range_error, если аргумент <= 0.

ffs() основан на единицах, поэтому добавление 1 к возвращаемому значению lsb() сделает егоэквивалент. Изменить: И, как указано, принимая во внимание случай прохождения 0.

Может быть что-то вроде

unsigned ffs512(const boost::multiprecision::uint512_t &n) {
  if (n.is_zero()) {
    return 0;
  } else {
    return boost::multiprecision::lsb(n) + 1;
  }
}
...