HOWTO · Java

在 Java 中將十進位制轉換為二進位制

本教程演示如何在 Java 中將十進位制轉換為二進位制。

本頁內容

Java 提供 Integer.toBinaryString(int),可將整數轉換為一般的二進位字串。下方範例會轉換整數 50。

在 Java 中將十進位整數轉換為二進位

若要直接轉換並使用最精簡的方法,請使用 Integer.toBinaryString。這個獨立程式會轉換整數 50,並印出其二進位數字:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

public class DecimalToBinary {
  public static void main(String[] args) {
    int decimal = 50;
    String binary = Integer.toBinaryString(decimal);
    System.out.println(binary);
  }
}

手動重複除法適合用來學習位值轉換;需要顯示指定數量的位元時,則可使用位元擷取。這些方法表示負值的方式不同,因此請依需求選擇:你要的是 Java 有號 int 的位元模式,還是有號數值字串?標準方法會回傳不含前置零的字串。對非負 int 而言,這是最精簡的表示法,因此十進位 50 會轉成 110010。對負 int,Java 會回傳 32 位元的二補數表示;例如,結果會包含 32 個二進位數字,而不是在絕對值前加上負號。若非負值需要固定顯示寬度,可以使用左側補零等字串操作。補零只改變呈現方式,不會改變整數的值。

使用重複除法手動將十進位整數轉換為二進位

若要自行組成數字,請將非負值反覆除以二,並記錄每次的餘數。餘數會從最低有效位到最高有效位依序產生,因此在顯示字串前要先反轉順序。這個版本會明確處理零,並將負值格式化為負號加上其絕對值的二進位數字。先轉成 long 再取絕對值,也能安全處理 Integer.MIN_VALUE。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

public class RepeatedDivision {
  static String toBinary(int value) {
    if (value == 0) {
      return "0";
    }

    boolean negative = value < 0;
    long remaining = Math.abs((long) value);
    StringBuilder digits = new StringBuilder();

    while (remaining > 0) {
      digits.append(remaining % 2);
      remaining /= 2;
    }

    digits.reverse();
    return negative ? "-" + digits : digits.toString();
  }

  public static void main(String[] args) {
    System.out.println(toBinary(33));
    System.out.println(toBinary(-33));
    System.out.println(toBinary(0));
  }
}

這個手動方法刻意以有號數值表示負輸入;負值的結果格式與 Integer.toBinaryString 不同。StringBuilder 會隨數字位數增加而擴展,避免使用任意設定大小的固定陣列。如果你只需要 Java 的一般整數轉換,請優先使用標準程式庫的方法。

使用位元運算子擷取整數位元

位元擷取可讓你指定要顯示的位元模式寬度。從該寬度的最高位元開始,將它右移至最低有效位元的位置,再以 1 遮罩。在這個範例中,寬度為八位元,值為 13:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

public class FixedWidthBits {
  public static void main(String[] args) {
    int value = 13;
    int width = 8;
    StringBuilder bits = new StringBuilder();

    for (int bit = width - 1; bit >= 0; bit--) {
      bits.append((value >>> bit) & 1);
    }

    System.out.println(bits);
  }
}

無號右移(>>>)與遮罩會分別取出每個位元。與 Integer.toBinaryString 不同,固定寬度會在顯示結果中保留前置零。請選擇符合預期表示方式的寬度:這個迴圈只顯示低八位元,因此較大的值或負值都會截斷至該寬度。若要顯示 int 的所有位元,請使用寬度 Integer.SIZE(32)。這是表示方式的選擇,不代表速度比較。

為什麼不使用 Math.pow() 建構二進位數字?

Math.pow() 會回傳 double,而把二進位數字當作整數的十進位位數來處理並不可靠。例如,將 remainder * Math.pow(10, position) 相加,會建構出一個字元恰好只有 0 和 1 的十進位數字;它儲存的並不是二進位值。數字位數增加時,這個十進位整數可能超出 int 的範圍,而浮點數次方也不適合用來建構任意精度的數字。數值本身也無法保留前置零:整數不會記錄原本打算在前面放幾個零字元。

請改用 String 表示二進位數字。使用 Integer.toBinaryString 取得 Java 的標準整數表示法;若要學習或自訂轉換,可使用重複除法;若需要特定寬度,則可使用有界的位元擷取。這些方法都能明確處理有號值的行為與前置零。