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)。