Подтвердить что ты не робот

Проверьте, имеет ли битбит только один бит, равный 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)?

4b9b3361

Ответ 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;
}

он нигде не близок, как умный, как другие опубликованные ответы, но он имеет то преимущество, что его легко понять.