修改字节中的特定位

ds1*_*709 5 c# bitwise-operators

我需要修改(!不是切换异或!)字节值中的特定位。我有:

  1. 来源byte(例如b11010010);
  2. 要修改的位索引(例如4);
  3. 0位(或)的新值1

现在,我需要什么。如果新值为0,则位[4] 必须设置为0。如果新值为1,则位[4] 必须设置为1

通用部分:

var bitIndex = 4;
var byte = b11010010;
var mask = 1 << bitIndex;
var newValue = 1;
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法:

if(newValue == 1)
    byte |= mask; // set bit[bitIndex]
else
    byte &= ~mask; // drop bit[bitIndex]
Run Code Online (Sandbox Code Playgroud)

另一种方法允许在不if else声明的情况下执行此操作,但看起来很难理解:

byte = byte & ~mask | (newValue << bitIndex) & mask
Run Code Online (Sandbox Code Playgroud)

这里,第一个AND删除bit[bitIndex],第二个AND计算 的新值bit[bitIndex],并OR设置bit[bitIndex]为计算值,无论是0还是1

有没有更简单的方法将特定位设置为给定值?

Tom*_*rvo 5

执行此操作的规范方法是:

byte ^= (-newValue ^ byte) & (1 << n);
Run Code Online (Sandbox Code Playgroud)

如果 newValue == 1,则设置位号 n;如果 newValue == 0,则清除位号 n