19

我有一个位板,如果只有一个位设置为 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)

4

2 回答 2

59

当然,这很容易:

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

b设置了任何位,最低有效位是位数k。然后具有与上面的索引b-1相同的位,一个 0 位在位,1 位在不太重要的位置,因此按位并从 中删除最低有效位。如果只设置了一位,则结果为 0,如果设置了更多位,则结果为非零。bkkbbb

于 2012-09-18T19:40:41.267 回答
3

这可能有点幼稚,但我会从 0 循环到 63,清除相关位,然后查看结果是否为 0:

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

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

于 2012-09-18T19:43:26.167 回答