我需要修改(!不切換異或!)字節值中的特定位。我有:修改字節中的特定位
- 來源
byte
(例如b11010010
); - 要修改的位的索引(例如
4
); - 位的新值(
0
或1
)。
現在,我需要什麼。如果新值爲0
,則位[4]必須設置爲0
。如果新值爲1
,則位[4]必須設置爲1
。
通用部分:
var bitIndex = 4;
var byte = b11010010;
var mask = 1 << bitIndex;
var newValue = 1;
這是爲了做到這一點,最簡單的方法:
if(newValue == 1)
byte |= mask; // set bit[bitIndex]
else
byte &= ~mask; // drop bit[bitIndex]
另一種方式允許這樣做沒有if else
說法,但看很難理解:
byte = byte & ~mask | (newValue << bitIndex) & mask
在這裏,第一個AND
滴bit[bitIndex]
,第二個AND
計算出bit[bitIndex]
和OR
集合bit[bitIndex]
的新值爲計算值,不管它是0
還是1
。
有沒有更簡單的方法將特定位設置爲給定值?
請選擇一個特定的語言將被設置。取決於特定的語言,可能會有非常不同的解決方案。 – user0042
只需將它移動到一個單獨的函數,如'SetBit(byte target,bool value)'。這已經很簡單了 - 沒有理由尋找「更簡單」的方式。 – Evk
「難以理解」的方式非常簡單。有一個較短的表達式,但它更晦澀:'值^((價值^(newValue << bitIndex))&面具)' – harold