我有一个位板,如果只有一个位设置为 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)
吗?
当然,这很容易:
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
设置了更多位,则结果为非零。
这可能有点
幼稚,但我会从 0 循环到 63,清除相关位,看看结果是否为 0:
if (b != 0) {
for (i = 0; i < 64; ++i) {
if (b & ~(1 << i)) == 0) {
return 1;
}
}
return 0;
}
它远不如其他发布的答案那么聪明,但它的优点是易于理解。