1. 程式人生 > >java改變byte的某一位值

java改變byte的某一位值

今天在對下位機發送指令的時候,由於下位機是根據byte裡面的某一位值來確定某個功能是否需要開啟/關閉的,因此控制下位機需要在改變某一位值的同時保留其他值不變。

這裡以改變第2位值為例。

剛開始時頭腦比較蒙,首先想到用int陣列來儲存對應byte的值,然後改變後對下的下標值來達到效果。如2,那麼int陣列為[0,0,0,0,0,0,1,0]。如果要關閉,則把第2位值變為0,即[0,0,0,0,0,0,0,0]。換算成資料就是0。
獲取int值每一位值可以參考以下程式碼實現:

/** 獲取16進位制值的每一位值
* @param hexValue (必須保證為2個位元組長度的String,否則得不到值)
* @return 返回長度為8的位元組陣列,每個值代表每一位的值
*/
private static byte[] getEachByteValue(String hexValue) {
    if (hexValue.length() != 2){
        return null;
    }
    byte bValue = (byte)Integer.parseInt(hexValue,16);
    byte[] array = new byte[8];
    for(int i = 7; i >= 0; i--){
        array[i] = (byte)(bValue & 1);
        bValue = (byte)(bValue >> 1);
    }
    return array;
}

之後再根據陣列算出最後的值就可以了。如[0,0,0,0,0,0,1,0]就是0 x 1+1 x 2+0 x 4+0 x 8……

後來總覺得不妥,喝了杯咖啡後豁然開朗(咖啡廠商自覺打錢),可以用與或運算來解決,如果需要把某位0變為1,那麼只需進行或運算就可以了,這樣其他位也不會受到影響。如:
00000000 |("或"運算) 00000010 = 00000010 這樣就完成置位了.

如果把某位從1變為0,則與運算, 如:
00000010 &("與"運算) 11111101 = 00000000

這樣換成程式碼就是 a | 0x02 和 a & 0xFC,瞬間程式碼簡短很多且執行效率提高。