19

私はビットボードを持っていて、C で 1 に設定されたビットが 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)か?

4

2 に答える 2

59

確かに、それは簡単です:

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

任意bのビットが設定されているとします。最下位は bit numberkです。次に、上記のインデックスb-1と同じビットを持ち、その場所に 0 ビット、下位の場所に 1 ビットがあるため、ビットごとに と から最下位セット ビットを削除します。ビットが 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 に答える