今日、ブラシleecodaが見つかっN&(N-1)この使用方法を、私はとても不思議な感じ、それを記録
1、int型の数が2のべき乗かどうかを見つけます
n = 4の場合、バイナリである:0100
N-1 = 3、バイナリである:0011
则:N・(N-1)== 0
図から分かるように、2のすべての権限は、高い進数は1でありされ、そしてこれだけは、4,0100として、高い; 8,1000。N-1、それは残りの1がN次いで、4-1,0011,8-1,0111ように、低くなると(N-1)、ゼロとなるハイレベルになると0になり
即ち、N・(N-1)== 0
2バイナリ、1にどのように多くのビット数
一方、(N> 0){
++数えます。
N = N・(N-1)。
}
N = N・(N-1)、これにより、それぞれが1を消費します。
3かどうかは、電源の数3
3、1162261467(19番目3)までのモジュロnは32で除去1162261467有する:Benbanfa単語と
パブリック クラスソリューション{ パブリックブールisPowerOfThree(INT N){ 戻り N> 0 &&(1162261467%のN == 0 )。 } }
4かどうかは、電源の数4
数が4のパワーである、2つの力がなければならない、逆に、真ではありません
したがって、最初の条件を決定するN・(N-1)== 0は、決定された数を見つけるために必要な条件である2のべき乗であること
ただ、など、数は、例えば、必ずしも2,8,32 4のパワー2の累乗されていないと言うこれらは2つのシリーズの力があります
しかし、我々はそのような数字の1を減算^ 0 ^ 1 = 2 = 4、2 ^ 4 = 16、2と2の偶数乗を、見つけることができる、2の奇数パワーながら、3で割り切れることができマイナス数が1から3で割り切れることができません
4この場合、我々は簡単な条件を見つけることができる必要十分な力、即ちN> 0 &&((N・(N-1))== 0)&&((N-1)%3 == 0)