判斷一個數是否是2的N次冪


第一種方法

public class TestJudge2NthPower {

  public static void main(String[] args) {
    System.out.println(isPowerOf2(-1));//false
    System.out.println(isPowerOf2(0));//false
    System.out.println(isPowerOf2(1));//true
    System.out.println(isPowerOf2(2));//true
    System.out.println(isPowerOf2(3));//false
    System.out.println(isPowerOf2(10));//false
    System.out.println(isPowerOf2(16));//true
    System.out.println(isPowerOf2(1 << 30));//true
  }

  //判斷目標值是否為2的N次冪
  private static boolean isPowerOf2(int target) {
    if (target <= 0) {
      return false;
    }
    if (target == 1) {
      return true;
    }
    //相當於target%2==0  對2取余,沒有余數
    while (target > 2 && (target & 1) != 1) {
      //相當於除以2
      target >>= 1;
    }
    return target == 2;
  }

}

暴力解法

第二種方法

public class TestJudge2NthPower2 {

  public static void main(String[] args) {
    System.out.println(isPowerOf2(-1));//false
    System.out.println(isPowerOf2(0));//false
    System.out.println(isPowerOf2(1));//true
    System.out.println(isPowerOf2(2));//true
    System.out.println(isPowerOf2(3));//false
    System.out.println(isPowerOf2(10));//false
    System.out.println(isPowerOf2(16));//true
    System.out.println(isPowerOf2(1 << 30));//true
  }

  //判斷目標值是否為2的N次冪
  private static boolean isPowerOf2(int target) {
    if (target <= 0) {
      return false;
    }
    return (target & (target - 1)) == 0;
  }

}

示例分析

以16為例,二進制表示為

00000000 00000000 00000000 00010000

16減1為15的二進制表示為

00000000 00000000 00000000 00001111

兩者按位與

00000000 00000000 00000000 00000000

十進制表示為0,說明是2的N次冪。

擴展-判斷一個數是否是n的N次冪

public class TestJudgeNNthPower {

  public static void main(String[] args) {
    System.out.println(isPowerOfN(-1, 3));//false
    System.out.println(isPowerOfN(0, 3));//false
    System.out.println(isPowerOfN(1, 3));//true
    System.out.println(isPowerOfN(2, 3));//false
    System.out.println(isPowerOfN(3, 3));//true
    System.out.println(isPowerOfN(10, 3));//false
    System.out.println(isPowerOfN(27, 3));//true
    System.out.println(isPowerOfN((int) Math.pow(4, 10), 4));//true
    System.out.println(isPowerOfN(1024, 8));//false
  }

  //判斷目標值是否為n的N次冪
  private static boolean isPowerOfN(int target, int n) {
    if (target <= 0) {
      return false;
    }
    if (target == 1) {
      return true;
    }
    while (target > n && (target % n) == 0) {
      target /= n;
    }
    return target == n;
  }

}

參考

[算法]快速判斷一個數是否是2的冪次方


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM