测试位板是否只有一位设置为1

时间:2012-09-18 19:38:45

标签: c bitboard

我有一个位板,如果只有一位设置为1,我想检查C。

#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)

2 个答案:

答案 0 :(得分:46)

当然,这很简单:

int only_one_bit_set_to_one (bboard b)
{
    return b && !(b & (b-1));
}

Say b设置了任何位,最不重要的是位号k。然后,对于b-1以上的索引,bk具有相同的位,在k处为0位,在较不重要的位置为1位,因此按位和从b中删除最不重要的设置位。如果b只设置了一个位,则结果变为0,如果b设置了更多位,则结果为非零。

答案 1 :(得分:2)

这可能有点天真,但我会从0循环到63,清除相关位,看看结果是否为0:

if (b != 0) {
    for (i = 0; i < 64; ++i) {
        if (b & ~(1 << i)) == 0) {
            return 1;
        }
    }
    return 0;
}

它远不如其他发布的答案那么聪明,但它具有易于理解的优势。