java实现:判断一个数是否为2的整数次幂

本文介绍三种方法判断一个数是否为2的幂次方,包括迭代乘法、位移运算和位运算技巧,深入解析算法原理及优化。

判断一个数是否为2的整数次幂

  • 方法1:
  • public class text{
    
        public static void main(String[] args){
    
            System.out.println(isPowerOf(100));
        }
    
        private static boolean isPowerOf(int num) {
            int t=1;
            while (t<=num){
                if (t==num){
                    return true;
                }
                t*=2;
            }
            return false;
        }
    }
  • 方法2:有一定的优化,但在时间复杂度上仍是O(logn),本质上并没有变
  • public class text{
    
        public static void main(String[] args){
    
            System.out.println(isPowerOf(100));
        }
    
        private static boolean isPowerOf(int num) {
            int t=1;
            while (t<=num){
                if (t==num){
                    return true;
                }
                t=t<<1;
            }
            return false;
        }
    }
  • 方法3:
  • public class text{
    
        public static void main(String[] args){
    
            System.out.println(isPowerOf(100));
        }
    
        private static boolean isPowerOf(int num) {
            return (num&num-1)==0;
        }
    }
  • 讲解
Java 中,判断一个是否2 的 n 次幂有多种方法。 #### 方法一:使用对计算 通过计算字的对,并比较对与其整数部分的差值来判断。该方法的代码如下: ```java public class PowerOfTwoCheck { public static boolean isPowerOfTwo(int num) { if (num <= 0) { return false; } double logValue = Math.log(num) / Math.log(2); return Math.abs(logValue - Math.round(logValue)) < 1e-10; } public static void main(String[] args) { int num = 16; System.out.println(isPowerOfTwo(num)); } } ``` #### 方法二:位运算 由于二进制表示的 2 的幂次方中只有一个 1,后面跟的是 n 个 0,将这个减去 1 后,仅有的那个 1 会变为 0,而原来的那 n 个 0 会变为 1,因此将原来的与上减去 1 后的字,结果为零。代码如下: ```java public class PowerOfTwoCheck { public static boolean isPowerOfTwo(int num) { return num > 0 && (num & (num - 1)) == 0; } public static void main(String[] args) { int num = 16; System.out.println(isPowerOfTwo(num)); } } ``` #### 方法三:判断是否为最大 2 的幂的约 在 32 位有符号整数的范围内,最大的 2 的幂为 `2^30 = 1073741824`,只需判断是否是 1073741824 的约即可。代码如下: ```java class Solution { static final int BIG = 1 << 30; public static boolean isPowerOfTwo(int n) { return n > 0 && BIG % n == 0; } public static void main(String[] args) { int num = 16; System.out.println(isPowerOfTwo(num)); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值