JAVA中:intとbyteの相互変換について
1994 ワード
原文住所:https://blog.csdn.net/sheng_Mu555/article/details/78949700
一、基礎概念:
1.原コード:
1 byteは1バイトで、1バイトは8ビットから構成されています.このうち最上位はシンボルビットであり、範囲は127~-128である.
すなわち、0111 1111~1111 1111
つまり、0000 0001は1を表し、
1000万は-128を表します.2.逆符号:
正数の逆符号はそれ自体(正数のシンボルビットは0)である.
負数の逆符号は、元の符号に基づいて、記号ビットは変わらず、他のビットは逆をとる.(負数の符号ビットは1)
すなわち、-128の原符号は:1000 0000である
逆符号化:1111 1111
3.補数:
補符号は,元の符号に基づいて符号ビットが不変であり,他のビットは逆+1をとる.
例えば:1の原号は:0000 0001 逆コード:0000 0001
シンボルビットは変更されず、反転: 0111 1111
+1(逢二進一) 補完コード:1111 1111
二、byteをintに変換する:
まず、intは4つの8ビット、すなわち4バイトあります.1.byte[]配列をintタイプに変換する場合:
まず、次のコードを参照してください.
1つのbyteが8ビット、intが4つの8ビットであるため、このbyte[0]を24ビット左にシフトし、このbyte[0]をintの最も高い8ビットに置いた.
同様に、byte[1]は2番目の8ビットに、byte[2]は3番目の8ビットに、byte[3]は4番目の8ビットに配置される.
2.質問:なぜ&0 xff?
まず0 xffは16進数の255,すなわちバイナリの1111 1111であり,0 xffに対しては,実際にはこの数の最低8ビットの値を取り,1バイトの長さを切り取る.
&0 xffを使用しない場合:
①コンピュータにおいては、補符号でデータを格納する.
②&0 xffを使用しない場合、負数の演算を行う際に問題が発生します.例えば、-1を使用して演算を行い、-1のbyte符号は1111 1111で、対応する16進数は0 xffです.
-1のint補符号(32ビット)は1111 1111 1111 1111 1111 1111 1111 1111であり、byteをintに変換すると対応する16進数は0 xffffである.
結果は正しくありません(負数の場合).
したがって,計算結果の正確性のためにバイトを&0 xff操作する.
三、intをbyte[]:
反対方向に操作するだけでいいです.
これでintとbyteの相互変換が完了した.
一、基礎概念:
1.原コード:
1 byteは1バイトで、1バイトは8ビットから構成されています.このうち最上位はシンボルビットであり、範囲は127~-128である.
すなわち、0111 1111~1111 1111
つまり、0000 0001は1を表し、
1000万は-128を表します.2.逆符号:
正数の逆符号はそれ自体(正数のシンボルビットは0)である.
負数の逆符号は、元の符号に基づいて、記号ビットは変わらず、他のビットは逆をとる.(負数の符号ビットは1)
すなわち、-128の原符号は:1000 0000である
逆符号化:1111 1111
3.補数:
補符号は,元の符号に基づいて符号ビットが不変であり,他のビットは逆+1をとる.
例えば:1の原号は:0000 0001 逆コード:0000 0001
シンボルビットは変更されず、反転: 0111 1111
+1(逢二進一) 補完コード:1111 1111
二、byteをintに変換する:
まず、intは4つの8ビット、すなわち4バイトあります.1.byte[]配列をintタイプに変換する場合:
まず、次のコードを参照してください.
/**
* byte int
* @param bytes
* @return
*/
public int Byte2Int(Byte[]bytes) {
return (bytes[0]&0xff)<<24
| (bytes[1]&0xff)<<16
| (bytes[2]&0xff)<<8
| (bytes[3]&0xff);
}
1つのbyteが8ビット、intが4つの8ビットであるため、このbyte[0]を24ビット左にシフトし、このbyte[0]をintの最も高い8ビットに置いた.
同様に、byte[1]は2番目の8ビットに、byte[2]は3番目の8ビットに、byte[3]は4番目の8ビットに配置される.
2.質問:なぜ&0 xff?
まず0 xffは16進数の255,すなわちバイナリの1111 1111であり,0 xffに対しては,実際にはこの数の最低8ビットの値を取り,1バイトの長さを切り取る.
&0 xffを使用しない場合:
①コンピュータにおいては、補符号でデータを格納する.
②&0 xffを使用しない場合、負数の演算を行う際に問題が発生します.例えば、-1を使用して演算を行い、-1のbyte符号は1111 1111で、対応する16進数は0 xffです.
-1のint補符号(32ビット)は1111 1111 1111 1111 1111 1111 1111 1111であり、byteをintに変換すると対応する16進数は0 xffffである.
結果は正しくありません(負数の場合).
したがって,計算結果の正確性のためにバイトを&0 xff操作する.
三、intをbyte[]:
反対方向に操作するだけでいいです.
/**
* int byte
* @param bytes
* @return
*/
public byte[]IntToByte(int num){
byte[]bytes=new byte[4];
bytes[0]=(byte) ((num>>24)&0xff);
bytes[1]=(byte) ((num>>16)&0xff);
bytes[2]=(byte) ((num>>8)&0xff);
bytes[3]=(byte) (num&0xff);
return bytes;
}
これでintとbyteの相互変換が完了した.