Java

[Java]byte型変数に格納されているビット列をコンソールに表示する

byteに格納されているビット列

Javaのbyte型には8ビット(=1バイト)のデータが格納されています。
byteに格納されているビット列(2進数)を16進数、10進数で表現すると以下のようになります。

ビット列(2進数) 16進数 10進数
00000000 00 0
01111111 7F 127
10000000 80 -128
11111111 FF -1

ビット列をコンソールに表示する

2進数表記で表示する方法と、16進数表記で表示する方法について説明します。

  • 2進数表記
1:  byte b = 10;
2:  int i = Byte.toUnsignedInt(b); // 符号なし変換
3:  String str = Integer.toBinaryString(i); // バイナリ文字列を取得
4:  str = String.format("%8s", str).replace(' ', '0'); // 0パディング
5:  System.out.println(str);
  • 16進数表記
1:  byte b = 10;
2:  System.out.print(String.format("%02X", b));

それぞれの出力結果は以下の通りです。

 2進数:00001010
16進数:0A

出力方法を比べてみると、2進数表記は色々と変換が必要となっていることが分かります。

2進数表記の時にどんな変換を行っているのか

2進数表記で具体的にどんな変換を行っているか説明します。
まずは2行目から。

2行目:byte型からint型へ変換する

2:  int i = Byte.toUnsignedInt(b); // 符号なし変換

この時、符号なしの変換を行っている点がポイントです。
理由は、int型の上位24ビットを0にするためです。

byte型(整数) int型<符号なし変換>(整数) int型<符号あり変換>(整数)
00000001(1) 00000000000000000000000000000001(1) 00000000000000000000000000000001(1)
11111111(-1) 00000000000000000000000011111111(255) 11111111111111111111111111111111(-1)

3行目:int型変数のバイナリ文字列(ビット列)を取得する

3:  String str = Integer.toBinaryString(i); // バイナリ文字列を取得

この時、上位の0は無視されます。符号なしの変換を行っていたのはこのためです。

int型(整数) バイナリ文字列
00000000000000000000000000000001(1) 1
00000000000000000000000011111111(255) 11111111

4行目:取得した文字列を0パディングする

4:  str = String.format("%8s", str).replace(' ', '0'); // 0パディング

具体的には、書式付き文字列を使って空白でパディングした後に、空白を0replaceしてます。

まとめ

プログラムの動作確認をしている時にふとbyte[]の中身を確認したくなり、方法を探したところ意外と苦戦してしまったため、実現方法をメモとして記事に残させていただきました。
小ネタですが誰かの役に立てれば幸いです。