我需要一个带有以下签名的有效方法:
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
然后结果为:11101111
(10
中的oldValue
段替换为11
中相应的newValue
段
答案 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的字节中设置一个位实际上是一个无操作,但我觉得应该留下代码,因为它可以帮助展示真正发生的事情。我鼓励代码的用户根据需要对其进行优化。