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
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