在计算机领域,2 有着特殊的地位。
现在给定一个数 n ,检验 n 是否为 2 的某次方。
最简单的方法当然是将 n 不断的 除以 2,如果 n 是 2 的次方,则最后能得到 商为 1。
稍作改良,可以用 移位来代替除以 2 ,因为移位直接在硬件操作,效率比做除法高。
具体代码如下:
public static boolean isPower(int n){
if(n < 1)
return false;
int i = 1;
while(i <= n){
if(i == n)
return true;
else
i<<=1;
}
return false;
}
时间复杂度为log n ,算是比较高效的。
但是还有更高效的算法:
充分利用二进制的位运算,如果一个数的二进制数表示只有一位是 1 ,那么这个数是 2 的某次方。
比如 n = 8 的二进制: 0000 1000;n = 16 的二进制 : 0001 0000 ......
那么 n-1 的二进制数的低位都是 1,即 7 的二进制 为 :0000 0111 , 15 的二进制为 : 0000 1111.
可知此时 n 与 n-1 没有一位同时为 1。将 n 与 n-1 做与运算 n&(n-1),结果应当为 0 。具体代码:
public static boolean isPower(int n){
if(n < 1)
return false;
int m = n&(n-1);
return m == 0;
}
此时时间复杂度为 O(1),比前面的方法高效得多