Javaで2進数カウンタを作る

これはなに

Javaで2進数のカウンタが必要になったのでどうやって作るかメモ

どんなものを作ろう

ある固定長のリストのあるインデックスの要素を使う,使わない,というのが分かるBool値を使うために最終的にboolean型のリストが手に入るようにします.

例えば,


int[] list = {1,2,3};

において,0, 1, 2, 3, 1+2, 1+3, 1+2+3の結果をそれぞれ求めたいときなんかに使います.
(今回使ったケースはもう少し複雑なケースだったけど…)

戦略

JavaにはInteger型をBinaryのStringに落としこむメソッドがあるようなのでそれを使って通常のIntegerのforループを2bitに変換します.
ソースコードにするとこんな感じでした


import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();

		int length = Integer.toBinaryString(n - 1).length();
		System.out.println(length);

		boolean[] output = new boolean[length];
		Arrays.fill(output, false);

		for (int i = 0; i < n; i++) {
			Arrays.fill(output, false);
			String strBinary = Integer.toBinaryString(i);
			System.out.println(i + ", " + strBinary);
			for (int j = 0; j < strBinary.length(); j++) {
				if(Integer.parseInt(strBinary.substring(
						strBinary.length() - j - 1, strBinary.length() - j)) == 0){
					output[j] = false;
				}else{
					output[j] = true;
				}
			}
			for (boolean o : output) {
				System.out.print(o + ",");
			}
			System.out.println();
		}
	}
}

nがリストの長さ出力させたい通り数(リストの例だと、n=2^3=8)で、outputがほしいboolean型のリストです.
標準入力に例えば4を入力すれば以下の様な出力が得られます.

面倒だったのが,Binary値がStringで,しかも最低ケタ数のものしか手に入らないので,
予め出力を0埋め(今回はfalse埋め?)をしてから入力値から得られたBinaryのStringをsubstringで必要な1文字を切り取り,Integerに変換するという回りくどいことをしています.


4
2
0, 0
false,false,
1, 1
true,false,
2, 10
false,true,
3, 11
true,true,

あとは出力をしている部分に処理を書くか,インクリメントの処理のメソッドを作るかすればやりたいことができるっぽいですね.

追記

Integer->ほしいBoolean値のリスト の変換器を作ったほうが賢かったですね.
こんな感じになりました.


import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();

		int length = Integer.toBinaryString(n - 1).length();
		System.out.println(length);

		boolean[] output = new boolean[length];
		Arrays.fill(output, false);

		for (int i = 0; i < n; i++) {
			for (boolean o : toBinaryBooleanList(i,length)) {
				System.out.print(o + ",");
			}
			System.out.println();
		}
	}

	private static boolean[] toBinaryBooleanList(int input, int outputLength) {
		boolean[] output = new boolean[outputLength];
		Arrays.fill(output, false);
		String strBinary = Integer.toBinaryString(input);

		for (int i = 0; i < strBinary.length(); i++) {
			int binary = Integer.parseInt(strBinary.substring(strBinary.length() - i - 1, strBinary.length() - i));
			if(binary == 0){
				output[i] = false;
			}else if(binary == 1){
				output[i] = true;
			}else{
				System.out.println("ERROR: toBinaryBooleanList");
			}
		}

		return output;
	}
}