在一个字节中设置一些连续的位

时间:2011-07-20 01:38:03

标签: c# byte bit-manipulation bit

我需要一个带有以下签名的有效方法:

public byte SetBits(byte oldValue, byte newValue, int startBit, int bitCount)

返回oldValue,仅从startbit位开始到其startbit + bitcount位(从零开始),它被bitcount位的newValue替换{1}}

例如,如果:

  • oldValue = 11101101
  • newValue = 10000011
  • startBit = 1
  • bitCount = 2

然后结果为:1110111110中的oldValue段替换为11中相应的newValue

3 个答案:

答案 0 :(得分:4)

在这里你去...... Bitshift两个方向来获取掩码......然后用它来生成新的字节

public static byte SetBits(byte oldValue, byte newValue, int startBit, int bitCount)
{
    if (startBit < 0 || startBit > 7 || bitCount < 0 || bitCount > 7 
                     || startBit + bitCount > 8)
        throw new OverflowException();

    int mask = (255 >> 8 - bitCount) << startBit;
    return Convert.ToByte((oldValue & (~mask)) | ((newValue << startBit) & mask));
}

答案 1 :(得分:0)

startBit--; //account for 0 indexing
byte flag = 1 << startBit;
for (int i = startBit; i < bitCount; i++, flag <<= 1)
{
    byte mask = newValue & flag;
    if (mask != 0)
        oldValue |= mask;
    else
        oldValue &= ~(flag);
}
return oldValue;

这里有一些大脑编译的代码,但如果我正确地阅读了这个问题,它应该是你想要的。

答案 2 :(得分:0)

如果我理解你的问题,我认为这就是你所追求的:

byte mask = 0xFF;
for (int i = startPos-1; i < numBits; i++)
{
     if ((newValue & (1 << i)) == 1)
     {
          mask = (byte)(mask | (1 << i));
     }
     else
     {
          mask = (byte)(mask &~(1<<i));
     }
 }
 return (byte)(oldValue & mask);

此代码基于Low Level Bit Hacks You Absolutely Must Know

的一些巧妙技巧

我知道在初始化为0xFF的字节中设置一个位实际上是一个无操作,但我觉得应该留下代码,因为它可以帮助展示真正发生的事情。我鼓励代码的用户根据需要对其进行优化。