byteの各bit値と一般的なビット操作の取得方法
5058 ワード
プロジェクトでは,信号収集ボードのデータから車上ダッシュボードのランプの情報を取得し,受信したデータをbyteに変換した後,各Byteの各Bit値を分離することで,各bitの値が表す具体的な情報を知る.ここではbyteの各bit値の取得方法を記録し、一般的なビット操作もついでに記録します.
1、1つのByteの各Bitの値を分離する
1文字の英字は1バイト(1文字=1 byte=8 bit)、1文字の漢字は2バイト(1漢字=2 byte=16 bit)です.
ここで、bit:ビット、1つのバイナリデータ0または1は、1 bitである.
byte:バイト、記憶空間の基本計量単位、1 byte=8 bit.
byte:1バイト(8ビット)(-128~127)(-2^7~2^7-1)
short:2バイト(16ビット)(-32768~32767)(-2^15~2^25-1)
int:4バイト(32ビット)(-2174483648~2174483647)(-2^31~2^31-1)
long:8バイト(64ビット)(922337203685474808~922337203685474807)(-2^63~2^63-1)
float:4バイト(32ビット)(3.402823 e+38~1.401298 e-45)(e+は10を乗じた38乗、e-45は10を乗じた負45乗)
double:8バイト(64ビット)(1.797693 e~4.97,000,000 e-324)
(1)byte-->bit
(2)bit-->byte
2、左シフトと右シフト
直接例:
(1)左シフト:3左シフト2ビット
|0000 0000 0000 0000 0000 0000 0000 0011
00|0000 0000 0000 0000 0000 1100空席補0
3<<1=6;3<<2=12;3<<3=24;
これにより、一つの法則が見えます.
3x2^1=6;3x2^2=12;3x2^3=24;
(2)右シフト:6右シフト2ビット
0000 0000 0000 0000 0000 0000 0000 0110|
0000 0000 0000 0000 0000 0000 0000 0001|10
空席補0(最高位を見て、ここで最高位は0)、負数最高位は1、補1です.
まとめ:<<左シフト:2を乗じた移動の桁数乗である.
>>右シフト:2で割った移動の桁数乗です.
>>:最高位補何は元のデータの最高ビット値によって決まり、0または1を補う.
>>>符号なし右シフト:最高位が何であれ、右シフト後に0を補う.
3、与(&)、或(|)、异或(^)
直接例:
(1)6&3=2;
110 1は真を表し、0は偽を表す.
& 011
010=2
(2)6|5=7;
110
| 101
111=7
(3) 6^5=3;
110
^ 101
011=3
もう一つの例を挙げます:7^4^4=7;(1つの数が異なるか、同じ数が2回あるか、結果はその数で、データ暗号化に使用できます)
111
^ 100
011
^ 100
111=7
1、1つのByteの各Bitの値を分離する
1文字の英字は1バイト(1文字=1 byte=8 bit)、1文字の漢字は2バイト(1漢字=2 byte=16 bit)です.
ここで、bit:ビット、1つのバイナリデータ0または1は、1 bitである.
byte:バイト、記憶空間の基本計量単位、1 byte=8 bit.
byte:1バイト(8ビット)(-128~127)(-2^7~2^7-1)
short:2バイト(16ビット)(-32768~32767)(-2^15~2^25-1)
int:4バイト(32ビット)(-2174483648~2174483647)(-2^31~2^31-1)
long:8バイト(64ビット)(922337203685474808~922337203685474807)(-2^63~2^63-1)
float:4バイト(32ビット)(3.402823 e+38~1.401298 e-45)(e+は10を乗じた38乗、e-45は10を乗じた負45乗)
double:8バイト(64ビット)(1.797693 e~4.97,000,000 e-324)
(1)byte-->bit
public class T {
/**
* byte 8 byte , bit
*/
public static byte[] getBooleanArray(byte b) {
byte[] array = new byte[8];
for (int i = 7; i >= 0; i--) {
array[i] = (byte)(b & 1);
b = (byte) (b >> 1);
}
return array;
}
/**
* byte bit
*/
public static String byteToBit(byte b) {
return ""
+ (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)
+ (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)
+ (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)
+ (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1);
}
public static void main(String[] args) {
byte b = 0x35; // 0011 0101
// [0, 0, 1, 1, 0, 1, 0, 1]
System.out.println(Arrays.toString(getBooleanArray(b)));
// 00110101
System.out.println(byteToBit(b));
// JDK , 0
System.out.println(Integer.toBinaryString(0x35));
}
}
(2)bit-->byte
/**
* byte
*/
public static byte decodeBinaryString(String byteStr) {
int re, len;
if (null == byteStr) {
return 0;
}
len = byteStr.length();
if (len != 4 && len != 8) {
return 0;
}
if (len == 8) {// 8 bit
if (byteStr.charAt(0) == '0') {//
re = Integer.parseInt(byteStr, 2);
} else {//
re = Integer.parseInt(byteStr, 2) - 256;
}
} else {// 4 bit
re = Integer.parseInt(byteStr, 2);
}
return (byte) re;
}
2、左シフトと右シフト
直接例:
(1)左シフト:3左シフト2ビット
|0000 0000 0000 0000 0000 0000 0000 0011
00|0000 0000 0000 0000 0000 1100空席補0
3<<1=6;3<<2=12;3<<3=24;
これにより、一つの法則が見えます.
3x2^1=6;3x2^2=12;3x2^3=24;
(2)右シフト:6右シフト2ビット
0000 0000 0000 0000 0000 0000 0000 0110|
0000 0000 0000 0000 0000 0000 0000 0001|10
空席補0(最高位を見て、ここで最高位は0)、負数最高位は1、補1です.
まとめ:<<左シフト:2を乗じた移動の桁数乗である.
>>右シフト:2で割った移動の桁数乗です.
>>:最高位補何は元のデータの最高ビット値によって決まり、0または1を補う.
>>>符号なし右シフト:最高位が何であれ、右シフト後に0を補う.
3、与(&)、或(|)、异或(^)
直接例:
(1)6&3=2;
110 1は真を表し、0は偽を表す.
& 011
010=2
(2)6|5=7;
110
| 101
111=7
(3) 6^5=3;
110
^ 101
011=3
もう一つの例を挙げます:7^4^4=7;(1つの数が異なるか、同じ数が2回あるか、結果はその数で、データ暗号化に使用できます)
111
^ 100
011
^ 100
111=7