Проверьте, имеет ли битбит только один бит, равный 1
У меня есть bitboard, и я хочу проверить C, если есть только один бит, установленный в 1.
#include <stdint.h>
typedef uint64_t bboard;
bboard b = 0x0000000000000010;
if (only_one_bit_set_to_one (b)) // in this example expected true
// do something...
Любая идея написать функцию int only_one_bit_set_to_one (bboard b)
?
Ответы
Ответ 1
Конечно, это легко:
int only_one_bit_set_to_one (bboard b)
{
return b && !(b & (b-1));
}
Скажите, что b
имеет любые установленные биты, наименее значимым является число бит k
. Тогда b-1
имеет те же биты, что и b
для индексов выше k
, 0-бит на месте k
и 1 бит в менее значительных местах, поэтому побитовое и удаляет наименее значимый бит набора из b
. Если b
был установлен только один бит, результат будет 0, если b
было установлено больше бит, результат отличен от нуля.
Ответ 2
Это может быть немного наивно, но я бы сделал цикл от 0 до 63, очистил соответствующий бит и посмотрел, равен ли результат 0:
if (b != 0) {
for (i = 0; i < 64; ++i) {
if (b & ~(1 << i)) == 0) {
return 1;
}
}
return 0;
}
он нигде не близок, как умный, как другие опубликованные ответы, но он имеет то преимущество, что его легко понять.