判断一个数是否是 2、3、4的幂次方

2的几次幂

判断一个数是否是 2的幂次方:

思路:在二进制中 2^n形式如下

2^1=2:10                          1:01

2^2=4:100                        3:011

2^3=8:   1000                     4:0111

2^4=16:  10000                  5:01111

......

 

def isPowerOfTwo(n: int) -> bool:
    if n==0:
        return False
    else:
        return n&(n-1)==0

 

判断一个数是否是 3的幂次方:

判断N是否是3的几次幂

1. 在 int 类型范围内,最大的一个3的幂数,一定是其他3的幂数的3^x 倍

2. 除3余数==0, 且最后是 3/3==1,则为3^x

INT_MAX = 0X7fffffff
INT_MIN = 0X80000000
import math
def power_3(n):
    if n < 1:    return False
    import math
    k = math.log(INT_MAX) // math.log(3)
    big3 = math.pow(3, k)
    return big3 % n == 0

def power_3(n):
    if n<1: return False
    else:
        while n%3==0:
            n = n//3
    return n==1

判断一个数是否是 4的幂次方:

判断N是4的几次幂

1.

4^1: 4      100                       0101

4^2: 16     10000                  10101

4^3: 64      1000000            1010101010

 

2. 除4余数==0, 且最后是 4/4==1,则为4^x

def power_4(n):
    if n==1:
        return True
    return n&(n-1) and n&0x55555555

def power_44(num):
    if num < 1:
        return False
    else:
        while num > 1:
            num = num / 4
    return num == 1

 

在 Java 中判断一个是否为 **2 的幂次方** 是一个常见的位运算问题。我们可以通过多种方法来实现,其中最高效的是使用 **位运算**。 --- ### ✅ 方法一:位运算(最优解) ```java public class PowerOfTwo { public static boolean isPowerOfTwo(int n) { // 注意:0 和负不是 2 的幂 return n > 0 && (n & (n - 1)) == 0; } public static void main(String[] args) { System.out.println(isPowerOfTwo(1)); // true (2^0) System.out.println(isPowerOfTwo(2)); // true (2^1) System.out.println(isPowerOfTwo(16)); // true (2^4) System.out.println(isPowerOfTwo(0)); // false System.out.println(isPowerOfTwo(-8)); // false System.out.println(isPowerOfTwo(18)); // false } } ``` #### 🔍 解释: - `(n & (n - 1)) == 0` 是关键。 - 对于 2 的幂来说,其二进制表示只有一个 `1`,例如: - `1 = 0b0001` - `2 = 0b0010` - `4 = 0b0100` - `8 = 0b1000` - 如果 `n` 是 2 的幂,那么 `n - 1` 会将这个唯一的 `1` 变成 `0`,并将后面的 `0` 全部变成 `1`,如: - `8 (0b1000)` → `7 (0b0111)` - `n & (n - 1)` 就是 `0`。 - 所以 `(n & (n - 1)) == 0` 可以判断这一点。 - 同时要确保 `n > 0`,因为 0 和负不能是 2 的幂。 --- ### 📌 方法二:使用 Math.log(不推荐) 虽然也可以使用对判断: ```java public static boolean isPowerOfTwo(int n) { if (n <= 0) return false; double log = Math.log(n) / Math.log(2); return Math.floor(log) == log; } ``` 但这种方法存在浮点精度问题,不推荐用于精确判断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值