java改變byte的某一位值
阿新 • • 發佈:2018-12-15
今天在對下位機發送指令的時候,由於下位機是根據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,瞬間程式碼簡短很多且執行效率提高。