AtCoderの問題などを解いていると整数と2進数の相互変換する機会があるので方法をメモ。
参考
全体のコード
整数を2進数に変換し、その後再び整数に戻すプロセスを実行しているコードが以下。
この例では、整数17を2進数に変換し、その2進数を再度整数に変換している。
import java.util.*;
public class ConvertNumberAndBinary {
static final int BIN_LENGTH = 10; // ビット数の設定
static final int NUMBER = 17;
public static void main(String[] args) {
// 整数 -> 2進数
int[] bin = number2binary(NUMBER);
// 2進数 -> 整数
int num = binary2number(bin);
System.out.println("17 -> " + Arrays.toString(bin) + " -> " + num);
}
private static int[] number2binary(int number) {
int[] bin = new int[BIN_LENGTH];
for (int i = 0; i < BIN_LENGTH; i++) {
int index = BIN_LENGTH - (i + 1);
int v = 1 << i;
int rightShifted = number / v;
bin[index] = rightShifted % 2;
}
return bin;
}
private static int binary2number(int[] bin) {
int number = 0;
for (int i = 0; i < BIN_LENGTH; i++) {
int index = BIN_LENGTH - (i + 1);
if (bin[index] == 1) {
number += (1 << i);
}
}
return number;
}
}
プログラムの実行結果
実行すると以下の出力が得られる。
17 -> [0, 0, 0, 0, 0, 0, 1, 0, 0, 1] -> 17
この結果は、整数17が2進数 [0, 0, 0, 0, 0, 0, 1, 0, 0, 1]
に変換され、再び17に戻されていることを示している。
BIN_LENGTH について補足
このプログラムでは、BIN_LENGTH
を10に設定している。
これは、2進数表現で使用するビット数を意味し、この場合は10ビットで表現される。
10ビットで表現できる最大の整数は [tex: 2^{10} - 1 = 1023] となる。
number2binary
number2binary
メソッドは、整数を2進数の配列に変換している。
このメソッドでは、与えられた数値を右シフトしながら、各ビットを計算して配列に格納している。
private static int[] number2binary(int number) {
int[] bin = new int[BIN_LENGTH];
for (int i = 0; i < BIN_LENGTH; i++) {
int index = BIN_LENGTH - (i + 1);
int v = 1 << i;
int rightShifted = number / v;
bin[index] = rightShifted % 2;
}
return bin;
}
binary2number
binary2number
メソッドは、2進数を表す整数の配列を受け取り、それを整数に変換する。
配列の各要素を左から右へと走査し、各ビットが1の場合に対応する2の累乗を合計していく。
private static int binary2number(int[] bin) {
int number = 0;
for (int i = 0; i < BIN_LENGTH; i++) {
int index = BIN_LENGTH - (i + 1);
if (bin[index] == 1) {
number += (1 << i);
}
}
return number;
}