通过ByteValue设置字节的位

时间:2018-01-21 20:04:36

标签: c# .net bit

我有Byte scaleValue,其值为3(0000.0011二进制)

现在我想在Byte Config的帮助下设置Byte scaleValue的BIT 3和4(缩放)(见图片),但它不起作用。

  • 之前:0000.0000(如果configByte的初始值为0)
  • 之后:0001.1000

这是我的代码:

configByte = (byte) (configByte | (scaleValue << 3));

Byte Config: enter image description here

2 个答案:

答案 0 :(得分:0)

如果configByte是整个8位块,并且scaleValue是要注入3/4位的值(当前位为0/1位),那么从根本上说,您需要:

configByte = (byte)(configByte | (scaleValue << 3));

然而,这假定:

  • configByte中的3/4位当前为零
  • {li> scaleValue中的位0/1设置(或不设置)

如果这两个假设不成立,那么你需要用...... mask:

来掩盖这个问题
configByte = (byte)((configByte & 231) | ((scaleValue & 3) << 3));

& 231删除旧值中的位3/4。 & 3仅在新值(移位前)中强制执行位0/1

答案 1 :(得分:0)

您可以使用以下扩展方法:

public static bool GetBit(this byte data, byte position)
{
    byte mask = (byte)(1 << position);
    return (data & mask) != 0;
}
public static byte SetBit(this byte data, byte position, bool value)
{
    byte mask = (byte)(1 << position);

    if (value)
    {
        return (byte)(data | mask);
    }
    else
    {
        return (byte)( data & (~mask));
    }
}
static void Main(string[] args)
{
    byte data = 0b0000100;

    if (data.GetBit(2))
    {

    }
    data = data.SetBit(4, true);
    data = data.SetBit(2, false);
}