如何判断一个数是否是2的n次方
2015-04-10 11:56
351 查看
2的n次方可以表示为:2^0,2^1,2^2,2^3,2^4......2^n。最直观的思想是用1做移位操作,然后判断移位后的值是否与给定的数相等,具体的实现代码如下:
以上算法的时间复杂度为O(logn)那么是否存在效率上更高的算法呢?通过对2^0,2^1,2^2,2^3,2^4......2^n分析,发现这些数字的二进制形式分别为:1,10,100,1000。。。从二进制的表示可以看出,如果一个数是2的n次方,那么这个数对应的二进制表示中只有一位是1,其余位都为0,因此,判断一个数是否为2的n次方可以转换为这个数对应的二进制表示中是否只有一位为1。如果一个数的二进制表示只有一个位为1,例如num=00010000,那么num-1的二进制表示为:num-1=00001111,由于num与num-1二进制表示中每一位都不相同,因此num&(num-1)的运算结果为0,可以利用这个方法来判断一个数是否为2的n次方。具体代码如下:
public class moveByte { public static boolean isPower(int n){ if(n<1) return false; int i=1; while(i<=n){ if(i==n) return true; i<<=1; } return false; } public static void main(String[] args) { System.out.println(isPower(256)); } }
以上算法的时间复杂度为O(logn)那么是否存在效率上更高的算法呢?通过对2^0,2^1,2^2,2^3,2^4......2^n分析,发现这些数字的二进制形式分别为:1,10,100,1000。。。从二进制的表示可以看出,如果一个数是2的n次方,那么这个数对应的二进制表示中只有一位是1,其余位都为0,因此,判断一个数是否为2的n次方可以转换为这个数对应的二进制表示中是否只有一位为1。如果一个数的二进制表示只有一个位为1,例如num=00010000,那么num-1的二进制表示为:num-1=00001111,由于num与num-1二进制表示中每一位都不相同,因此num&(num-1)的运算结果为0,可以利用这个方法来判断一个数是否为2的n次方。具体代码如下:
public class moveByte { public static boolean isPower(int n){ if(n<1) return false; int m=n&(n-1); return m==0; } public static void main(String[] args) { System.out.println(isPower(3)); } }
相关文章推荐
- 如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?
- 如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?
- 如何判断一个数是否是2的幂次方数
- 如何判断一个数是否为2的N次方
- 如何判断一个日期是否属于当前系统本月的日期
- 在shell中如何判断一个变量是否为空
- ORACEL如何判断一个表中某列是否存在
- 如何判断一个对象是否是基本类型的Wrapper
- C#实现如何判断一个字符串是否为整数和浮点
- 如何判断一个已知的表中是否存在某个字段,如果不存在就创建它.
- 如何判断一个单向链表是否有环路
- 如何判断一个字符串是否为正确的IP地址
- 如何用jsp判断网页上一个传值是否为空
- 如何判断一个文件或目录是否存在
- 如何判断一个整数是否为奇数
- 如何判断一个已知的表中是否存在某个字段,如果不存在就创建它.
- 如何判断一个类是否继承ICollection接口
- 如何快速判断一个整数是否可以整除另一个整数的理论分析