Я пытаюсь найти первый установленный бит в машинном слове.Следующий фрагмент взят из реализации bitset
в GCC, которую я изменил, чтобы использовать для маскирования первых x битов, которые я хочу пропустить.
// mask off bits below bound
__thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__start_from);
auto index = __builtin_ffs(__thisword);
Проблема в том, что два раза.
Половина документации в Google гласит, что __builtin_ffs
занимает unsigned int
, а другая половина - int
.Версия GCC, которую я использую, ожидает int
.
Это вызывает мою вторую проблему, если я использую int
как _WordT
, это вызывает неопределенное поведение во время левого сдвига.Если я использую unsigned int
как тип, я получаю ошибку изменения знака, потому что __builtin_ffs
ожидает int
.
Использование сдвига влево с int
дает правильный результат, но спредупреждения.Что может быть обходным путем для этого?