2進数で表される2の累乗には、正確に1つのビットが設定され、その他はすべてゼロです。
1を引くと、右端のビットを含むすべてのビットが反転します。
110101100 - 1=> 110101011 (in the case of zero, all bits get inverted)
が2の累乗であるnum & (num - 1)
場合にのみ、ゼロと評価されると仮定します。num
num
が実際に2の累乗である場合、合計で1つのビットが設定されます。1を引くと、そのビットは0になり、すべてのビットがその右側に1に設定されます。
したがって、セットビットnum
を共有するnum - 1
ことはできません。したがって、num & (num - 1)
0と評価されます。
が2の累乗でnum
はない(ゼロではない)場合は、少なくとも2ビットが設定されています。1を引くと、右端のセットビットのみが変更され、その右のセットビットだけが変更され、他のビットは影響を受けません。
したがって、最大で1セットのビットnum
を共有します。ゼロではなく、2の累乗ではないため、ゼロと評価することはできないnum - 1
と結論付けます。num & (num - 1)
num
したがって、正しいチェックは次のとおりです。num && !(num & (num - 1))
複雑さ:通常のコンピューターでは、すべての二項演算は一定時間で発生します。一定時間の演算が一定量あるため、関数全体が一定時間で返されますO(1)
。
その関数を呼び出すときは、n
呼び出すたびに一定時間の作業を行います。2n
倍になると、作業量が2倍になります。したがって、その場合の複雑さはですO(n)
。