修改字节中的特定位

时间:2017-07-09 12:27:54

标签: c# bitwise-operators

我需要在字节值中修改(!不切换XOR!)特定位。我有:

  1. 来源Formtastic(例如byte);
  2. 要修改的位索引(例如b11010010);
  3. 位(40)的新值。
  4. 现在,我需要什么。如果新值为1,则位[4]必须设置为0。如果新值为0,则必须将位[4]设置为1

    一般部分:

    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

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

3 个答案:

答案 0 :(得分:1)

这样做的规范方法是:

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

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

答案 1 :(得分:0)

myByte = Convert.ToByte(myByte | (1 << bitNumber));

答案 2 :(得分:0)

(newValue << bitIndex)仅设置了一个位,不需要& mask

所以您只有5次操作。

byte = byte & ~(1 << bitIndex) | (newValue << bitIndex); // bitIndex'th bit becomes newValue

它仍然足够复杂,值得一提,但很容易看出该评论是正确的,因为它是两个容易识别的操作链接在一起的(不同于当前接受的答案,这需要每个读者坐下来思考一下,以得出一个正确的答案)分钟)