C#语言:改变字节中的前四位

chu*_*ray 9 c# bit-manipulation

为了充分利用字节,我试图将两个唯一值存储到一个字节中:一个在前四位中,另一个在后四位中.但是,我发现,虽然这种做法允许优化内存分配,但它使得更改存储在字节中的各个值变得困难.

在我的代码中,我想改变一个字节中的第一组四位,同时保持同一字节中后四位的值.虽然按位运算允许我轻松检索和操作前四位值,但我发现很难将这个新值与一个字节中的第二组四位连接起来.问题是,如何从一个字节中擦除前四位(或者更准确地说,将它们全部置零)并添加新的4位组以替换刚刚擦除的四位,从而保留最后4位改变前四个字节的位数?

这是一个例子:

//  Changes the first four bits in a byte to the parameter value
public void changeFirstFourBits(byte newFirstFour)
{
    //  If 'newFirstFour' is 0101 in binary, make 'value' 01011111 in binary, changing
    //  the first four bits but leaving the second four alone.
}

private byte value = 255; // binary: 11111111
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 19

使用按位AND(&)清除旧位,将新位移位到正确位置并按位OR(|)将它们组合在一起:

value = (value & 0xF) | (newFirstFour << 4);
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

                       value        : abcdefgh
                       newFirstFour : 0000xyzw

                               0xF  : 00001111
                       value & 0xF  : 0000efgh
                  newFirstFour << 4 : xyzw0000
(value & 0xF) | (newFirstFour << 4) : xyzwefgh
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 12

当我不得不这样做时,我会做一个只读结构来为我做这件事.当然,一个四位整数称为nybble:

struct TwoNybbles
{
    private readonly byte b;
    public byte High { get { return (byte)(b >> 4); } }
    public byte Low { get { return (byte)(b & 0x0F); } {
    public TwoNybbles(byte high, byte low)
    {
        this.b = (byte)((high << 4) | (low & 0x0F));
    }
Run Code Online (Sandbox Code Playgroud)

然后在TwoNybbles和byte之间添加隐式转换.现在,您可以将任何字节视为具有高字节和低字节,而不会在主线代码中放置所有那些丑陋的字符.