在一个字节中组合2个数字

时间:2013-04-25 12:16:03

标签: c# byte bit bitarray

我有两个数字(从0到9)我希望将它们组合成1个字节。 数字1取0-3位,数字2取4-7位。

示例:我有3号和4号 3 = 0011,4是0100 结果应为0011 0100。

如何使用这些二进制值创建一个字节?

这就是我目前所拥有的:

    public Byte CombinePinDigit(int DigitA, int DigitB)
    {
        BitArray Digit1 = new BitArray(Convert.ToByte(DigitA));
        BitArray Digit2 = new BitArray(Convert.ToByte(DigitB));

        BitArray Combined = new BitArray(8);
        Combined[0] = Digit1[0];
        Combined[1] = Digit1[1];
        Combined[2] = Digit1[2];
        Combined[3] = Digit1[3];  

        Combined[4] = Digit2[0];
        Combined[5] = Digit2[1];
        Combined[6] = Digit2[2];
        Combined[7] = Digit2[3];
    }

使用此代码,我有ArgumentOutOfBoundsExceptions

2 个答案:

答案 0 :(得分:5)

忘记所有那些比特的东西。

这样做:

byte result = (byte)(number1 | (number2 << 4));

让他们回来:

int number1 = result & 0xF;
int number2 = (result >> 4) & 0xF;

这可以通过使用<<>>位移运算符来实现。

当创建字节时,我们将number2向左移位4位(用0填充结果的最低4位)然后我们使用|或那些具有未移位位的位number1

恢复原始数字时,我们会撤消此过程。我们将字节移位4位,将原始number2放回原位,然后我们使用& 0xF屏蔽其他任何位。

number1的这个位已经处于正确的位置(因为我们从未移位它们)所以我们只需要用& 0xF再屏蔽其他位。

在执行此操作之前,您应该验证数字是否在0..9范围内,或者(如果您不在乎它们是否超出范围)您可以通过使用0xF将它们约束为0..15 :

byte result = (byte)((number1 & 0xF) | ((number2 & 0xF) << 4));

答案 1 :(得分:3)

这应该基本上起作用:

byte Pack(int a, int b)
{
    return (byte)(a << 4 | b & 0xF);
}

void Unpack(byte val, out int a, out int b)
{
    a = val >> 4;
    b = val & 0xF;
}