数が2のべき乗かどうかを判断するテクニック


判定する数を符号無し整数Xとする.
まずXが0であるか否かを判断し,0であれば2のn乗ではなく,返す.
XとX-1はビットと操作を行い、結果が0であれば、この数が2のn乗であることを示す.結果が0でない場合、この数は2のn乗ではないことを示します.
証明:
2のn乗の場合、この数はバイナリで表される場合、1ビットのみが1であり、その他は0である.1を減算すると、このビットは0になり、後のビットは1になるので、ビットと後の結果は0になります.
2のn乗でない場合、この数はバイナリで表される場合、複数のビットが1である.1を減らすと、最後の1だけが0になり、前の1はまだ1なので、ビットと後の結果は0ではありません.
f = v && !(v & (v - 1));

例を挙げます.
n=16=10000の場合、n-1=1111
では、
10000
& 1111
----------
                          0
もう1つの例を挙げると、n=256=1000000の場合、n-1=11111111
では、
100000000
&11111111
--------------
        0