2017-07-09 55 views
-1

我需要修改(!不切換異或!)字節值中的特定位。我有:修改字節中的特定位

  1. 來源byte(例如b11010010);
  2. 要修改的位的索引(例如4);
  3. 位的新值(01)。

現在,我需要什麼。如果新值爲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 

在這裏,第一個ANDbit[bitIndex] ,第二個AND計算出bit[bitIndex]OR集合bit[bitIndex]的新值爲計算值,不管它是0還是1

有沒有更簡單的方法將特定位設置爲給定值?

+1

請選擇一個特定的語言將被設置。取決於特定的語言,可能會有非常不同的解決方案。 – user0042

+0

只需將它移動到一個單獨的函數,如'SetBit(byte target,bool value)'。這已經很簡單了 - 沒有理由尋找「更簡單」的方式。 – Evk

+0

「難以理解」的方式非常簡單。有一個較短的表達式,但它更晦澀:'值^((價值^(newValue << bitIndex))&面具)' – harold

回答

1

的規範辦法做到這一點是:

byte ^= (-newValue^byte) & (1 << n); 

位數n如果NEWVALUE == 1,和清除,如果NEWVALUE == 0

+0

謝謝。看起來像我需要的東西。 )) – user2123532

+0

@ user2123532非常感謝您的接受投票,但您是否也可以投票贊成答案。 Upvoted和接受的答案在搜索結果中顯示出更高的優勢,並且有更多的潛力來幫助他人。 :) – TomServo

+1

對不起,但我不能因爲聲譽。至少需要15票才能投票。 – user2123532