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パディング
具体的には、書式付き文字列を使って空白でパディングした後に、空白を0
にreplace
してます。
まとめ
プログラムの動作確認をしている時にふとbyte[]の中身を確認したくなり、方法を探したところ意外と苦戦してしまったため、実現方法をメモとして記事に残させていただきました。
小ネタですが誰かの役に立てれば幸いです。