java 如何判断一个数是否为2的整数次幂以及是2的多少次方(整数幂)?

写在前面,此处不考虑负数!!!

如何简洁快速的判断一个正整数是否是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

收官!

你可能感兴趣的:(Java编程,java,restful)