写在前面,此处不考虑负数!!!
如何简洁快速的判断一个正整数是否是2的整数次幂,以及如果是整数次幂,是多少次幂?方法非常简单。
话不多说,先上代码;
public static int isTimesTwo(int n) throws Exception {
if(!(n > 0 && (n & (n - 1)) == 0)){
throw new Exception("参数有误,不是2的整数次幂");
}
return Integer.toBinaryString(n).length()-1;
}
代码虽然简单,但是每一行都有说法,下面小做解释:
1.假设一个数是2的整数幂,则这个数在2进制中表现形式必须为 10,100,1000,10000,100000,…的形式;
2.在理解1的其前提下,那么在Java中我们如何快速简洁的判断参数在二进制形势下是否如1所述的格式呢?
即为在代码中表现为需要满足 if 里面的条件,此处抛弃调循环和递归的方式,因为麻烦;那么继续借用1的思路,发现如果参数n二进制满足10,100,1000,10000,100000,…的形式,则n-1一定是01,011,0111,0111,01111形式。
此处在用一个 & 运算 实现判断条件 即为
(n & (n - 1)) == 0
不了解 & 运算请参考本博客https://blog.csdn.net/baiyan3212/article/details/82778674,很好理解!
3.满足1和2 的条件后,说明参数n是2的整数次幂,现在求到底是多少次幂,观察n的二进制形式 10,100,1000,10000,100000 。。。发现都是 以 1 开头的字符串,结合二进制的含义,发现该二进制从右往左 1 对应的小标就是想要的答案(参数n为2的多少次幂)
为了避免逆向翻转字符串,我们直接用字符串长度-1代替,效果一样!
再次贴上带打印输出代码和运星结果,以方便理解!
public static int isTimesTwo(int n) throws Exception {
System.out.println("------10进制输出-------");
System.out.println(n);
System.out.println("-------2进制输出-------");
if(!(n > 0 && (n & (n - 1)) == 0)){
throw new Exception("参数有误,不是2的整数次幂");
}
System.out.println(Integer.toBinaryString(n));
System.out.println("------2的次方数---------");
System.out.println(Integer.toBinaryString(n).length()-1);
return Integer.toBinaryString(n).length()-1;
}
运行结果贴图:
------10进制输出-------
64
-------2进制输出-------
1000000
------2的次方数---------
6
------10进制输出-------
256
-------2进制输出-------
100000000
------2的次方数---------
8
收官!