描述
判断一个数是否是2的幂。
二进制处理
如果一个数
n
n
n是2的幂,则
n
n
n毕竟是正整数,而且
n
n
n的二进制表示中有且仅有一个1。
因此,可以考虑使用位运算,将
n
n
n的二进制表示中最低位的那个1提取出来,再判断剩下的数值是否为0即可。
这里介绍两种常见的处理二进制表示中最低位的方法。
n & ( − n ) n \& (-n) n&(−n)
其中
&
\&
&表示按位与运算。已知n是正整数,则
−
n
-n
−n 就是
n
n
n的相反数,为负数。这个方法可以直接获取
n
n
n二进制表示的最低位的1。
我们知道,负数在计算机中是以补码的形式存储的,则*-n的二进制表示为n*的二进制表示的反码(对二进制的每一位取反)加1,其原理如下:
假设 n n n的二进制表示为 ( a 1000 ) 2 (a1000)_2 (a1000)2( a a a表示若干个高位),则 − n -n −n 的二进制表示为 ( a ˉ 0111 ) 2 + ( 1 ) 2 = ( a ˉ 1000 ) 2 (\bar{a}0111)_2 + (1)_2 = (\bar{a}1000)_2 (aˉ0111)2+(1)2=(aˉ1000)2,将 n n n和 − n -n −n进行按位与运算后,高位全部变为0,最低位的1以及后面的所有0都不变,从而便可以获取 n n n的二进制表示的最低位的1。
因此,如果 n n n是正整数且 n & ( − n ) = n n \& (-n) = n n&(−n)=n,则 n n n就是2的幂。
n & ( n − 1 ) n\&(n-1) n&(n−1)
该方法可以直接将 n n n的二进制表示中最低位的1给移除掉,原理如下:
假设 n n n的二进制表示为 ( a 1000 ) 2 (a1000)_2 (a1000)2( a a a表示若干个高位),则 n − 1 n-1 n−1 的二进制表示为 ( a 0111 ) 2 (a0111)_2 (a0111)2,将 n n n和 n − 1 n-1 n−1进行按位与运算后,高位 a a a不变,而在这之后的所有位都变为0,从而将最低位的那个1移除了。
因此,如果 n n n是正整数且 n & ( n − 1 ) = 0 n\&(n-1)=0 n&(n−1)=0,则 n n n就是2的幂。