Javaプログラミング学習サイト ゆるゆるプログラミング

2019/07/09 公開

・byte型をint型へ

Javaのbyte型の値の範囲は-128~127です。ここでは、byte型ビットの並びから値の範囲を"-128~127"から"0~255"に変換し、int型変数に格納する方法を説明します。byte型変数に格納されている8ビットの列をそのまま10進数にした値をint型変数に格納することで0から255の値に変換します。

それでは、変換方法について説明していきましょう。

まず、下の表を観てください。これはbyte型ビット列とその値、byte型の値を変換した後のint型の値をまとめたものです。

byte型のビット列 byte型の値 変換後のint型の値(目標)
 00000000  0 0
 00000001  1 1
 00000010  2 2
 00000011  3 3
   ~  ~    ~
 01111101  125 125
 01111110  126 126
 01111111  127 127
 10000000  -128 128
 10000001  -127 129
 10000010  -126 130
   ~  ~    ~
 11111101  -3 253
 11111110  -2 254
 11111111  -1 255

この表から、byte型ビット列"00000000"(0)から"01111111"(127)までは、ビット列の2進数とbyteの値が一致していることが分かります。

byte型ビット列"10000000"からbyte型の値がマイナスの値になっていることがわかります。一般的に2進数の"10000000"は10進数の128を表しますが、Javaのbyte変数の場合には"-128"になっています。

ビット列"10000000"以降のbyte型の値が変換後のintの値と一致しないので、これを一致させるプログラムを作成します。

ここから、byte型int型に変換するプログラムを紹介していきます。

以下のソースコードは、byte型の8ビットから10進数の値を求める方法を使っています。各ビット毎にAND演算することで、ビットが0か1かを判定しています。

BytetoInt1.java ← クリックしてダウンロードページに移動
001:    public class BytetoInt1 {
002:    	// byteのビットの並びでintに変換
003:    	public static int BytetoInt( byte b )
004:    	{
005:    		int i;
006:    
007:    		i = 0;
008:    		// 8ビット目が1かどうか
009:    		if ( 0 != ( 0x80 & b ) ) i += 128;
010:    		// 7ビット目が1かどうか
011:    		if ( 0 != ( 0x40 & b ) ) i +=  64;
012:    		// 6ビット目が1かどうか
013:    		if ( 0 != ( 0x20 & b ) ) i +=  32;
014:    		// 5ビット目が1かどうか
015:    		if ( 0 != ( 0x10 & b ) ) i +=  16;
016:    		// 4ビット目が1かどうか
017:    		if ( 0 != ( 0x08 & b ) ) i +=   8;
018:    		// 3ビット目が1かどうか
019:    		if ( 0 != ( 0x04 & b ) ) i +=   4;
020:    		// 2ビット目が1かどうか
021:    		if ( 0 != ( 0x02 & b ) ) i +=   2;
022:    		// 1ビット目が1かどうか
023:    		if ( 0 != ( 0x01 & b ) ) i +=   1;
024:    
025:    		return i;
026:    	}
027:    
028:    
029:    	// メイン
030:    	public static void main( String[] args ) {
031:    		// 変数を宣言
032:    		byte b;
033:    		int  i;
034:    
035:    		// バイトの値 1
036:    		b = 1;
037:    		i = BytetoInt( b );
038:    		System.out.println( "byte: " + b );
039:    		System.out.println( "int : " + i );
040:    		System.out.println();
041:    
042:    		// バイトの値 127
043:    		b = 127;
044:    		i = BytetoInt( b );
045:    		System.out.println( "byte: " + b );
046:    		System.out.println( "int : " + i );
047:    		System.out.println();
048:    
049:    		// バイトの値 -1
050:    		b = -1;
051:    		i = BytetoInt( b );
052:    		System.out.println( "byte: " + b );
053:    		System.out.println( "int : " + i );
054:    		System.out.println();
055:    
056:    		// バイトの値 -128
057:    		b = -128;
058:    		i = BytetoInt( b );
059:    		System.out.println( "byte: " + b );
060:    		System.out.println( "int : " + i );
061:    	}
062:    }

BytetoInt1の出力結果

byte: 1
int : 1

byte: 127
int : 127

byte: -1
int : 255

byte: -128
int : 128

byte型の値をint型に変換できました。

ソースコードの中のbyte型int型に変換するメソッドについて説明します。

002:    	// byteのビットの並びでintに変換
003:    	public static int BytetoInt( byte b )
004:    	{
005:    		int i;
006:    
007:    		i = 0;
008:    		// 8ビット目が1かどうか
009:    		if ( 0 != ( 0x80 & b ) ) i += 128;
010:    		// 7ビット目が1かどうか
011:    		if ( 0 != ( 0x40 & b ) ) i +=  64;
012:    		// 6ビット目が1かどうか
013:    		if ( 0 != ( 0x20 & b ) ) i +=  32;
014:    		// 5ビット目が1かどうか
015:    		if ( 0 != ( 0x10 & b ) ) i +=  16;
016:    		// 4ビット目が1かどうか
017:    		if ( 0 != ( 0x08 & b ) ) i +=   8;
018:    		// 3ビット目が1かどうか
019:    		if ( 0 != ( 0x04 & b ) ) i +=   4;
020:    		// 2ビット目が1かどうか
021:    		if ( 0 != ( 0x02 & b ) ) i +=   2;
022:    		// 1ビット目が1かどうか
023:    		if ( 0 != ( 0x01 & b ) ) i +=   1;
024:    
025:    		return i;
026:    	}

byte型int型に変換するメソッドです。8行目から23行目でビットの判定を行っています。判定に使っている"0x"で始まる値は16進数の値で、2進数では以下のようになります。

  0x80は、8ビット列で"10000000"、10進数で128

  0x40は、8ビット列で"01000000"、10進数で64

  0x20は、8ビット列で"00100000"、10進数で32

  0x10は、8ビット列で"00010000"、10進数で16

  0x08は、8ビット列で"00001000"、10進数で8

  0x04は、8ビット列で"00000100"、10進数で4

  0x02は、8ビット列で"00000010"、10進数で2

  0x01は、8ビット列で"00000001"、10進数で1

左端にある1が、1つずつ右にずれていっていることが分かります。

上記の8つの値と元のbyteの値のAND演算をすることでビットの有無を検出することができます。AND演算は、両方のビットが1の場合だけ1になります。

AND

例えば、0x80("10000000")と"10100001"のAND演算の結果は"10000000"となります。これは2つの値をビット単位で比べたとき、両方が1のビットは1番左だけであるためです。

その他、0x80("10000000")と"01111111"のAND演算の結果は"00000000"となります。これは2つの値をビット単位で比べたとき、両方が1のビットが無いためです。

このように各ビットが0か1かは、AND演算を使うことで実現できます。

ビットが1の時に10進数の値を足していけば、ビット列を10進数にした値が得られます。

次のソースコードは、Java 8以降で使えるByte.toUnsignedIntメソッドを利用したものです。

Byte.toUnsignedIntは、byte型の値を引数として渡して、符号無しのint型の値を戻すものです。メソッドを呼ぶだけでビット列に対応するint型の値に変換できます。

BytetoInt2.java ← クリックしてダウンロードページに移動
001:    public class BytetoInt2 {
002:    	public static void main( String[] args ) {
003:    		// 変数を宣言
004:    		byte b;
005:    		int  i;
006:    
007:    		// バイトの値 1
008:    		b = 1;
009:    		i = Byte.toUnsignedInt( b );
010:    		System.out.println( "byte: " + b );
011:    		System.out.println( "int : " + i );
012:    		System.out.println();
013:    
014:    		// バイトの値 127
015:    		b = 127;
016:    		i = Byte.toUnsignedInt( b );
017:    		System.out.println( "byte: " + b );
018:    		System.out.println( "int : " + i );
019:    		System.out.println();
020:    
021:    		// バイトの値 -1
022:    		b = -1;
023:    		i = Byte.toUnsignedInt( b );
024:    		System.out.println( "byte: " + b );
025:    		System.out.println( "int : " + i );
026:    		System.out.println();
027:    
028:    		// バイトの値 -128
029:    		b = -128;
030:    		i = Byte.toUnsignedInt( b );
031:    		System.out.println( "byte: " + b );
032:    		System.out.println( "int : " + i );
033:    	}
034:    }

BytetoInt2の出力結果

byte: 1
int : 1

byte: 127
int : 127

byte: -1
int : 255

byte: -128
int : 128

結果は、ビット列のAND演算するBytetoInt1.javaで得た結果と同じになりました。

■関連コンテンツ

2進数 2で繰り上がる数値表現
ビット演算子 ビット演算子について解説
型キャスト 変数の型を変換する方法について解説
Javaで扱う変数について解説-画像

Javaの変数

変数は、プログラムの中で値を入れておく入れ物のようなものです。

■新着情報

2021.08.04 書式指定でコンソール出力 printf()とは?

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

 

Topへ