java改變byte的某一位值

2021-09-03 01:23:12 字數 958 閱讀 4030

今天在對下位機傳送指令的時候,由於下位機是根據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)

byte bvalue = (byte)integer.parseint(hexvalue,16);

byte array = new byte[8];

for(int i = 7; i >= 0; i--)

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,瞬間**簡短很多且執行效率提高。

如何對某一位清0或置位?

如何對某一位置0或者置1?方法一 寫成巨集,方便移植 define setbit x,y x 1 而將該位設定為1的做法是 define int i2 mask 0x0040 wtemp inword int mask outword int mask,wtemp int i2 mask 判斷該位是...

數字序列中某一位的數字

面試題44 數字序列中某一位的數字 題目 數字以0123456789101112131415 的格式序列化到乙個字串行中。在這 個序列中,第5位 從0開始計數 是5,第13位是1,第19位是4,等等。請寫一 個函式求任意位對應的數字。static int digit at uint32 t inde...

數字序列中某一位的數字

012345678910.序列中,第n位數 def solution n if n 0 return 1 if n 10 return n i 2 確定是第幾位數 sums 10 ret 0while true 一位數 0 9 共10個字元 兩位數 10 99 共180個字元 三位數 100 999...