将两个数字组合成一个字节

5

我有两个数字(从0到9),我想将它们合并成一个字节。数字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];
    }

使用这段代码会出现ArgumentOutOfBoundsException异常。

2个回答

7
忘掉所有的bitarray相关内容吧。只需这样做:
byte result = (byte)(number1 | (number2 << 4));

要将它们取回来:

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

使用 <<>> 位移运算符可以实现此功能。

创建字节时,我们将number2左移4位(这会将结果的最低4位填充为0),然后使用 | 将那些位与number1未移位的位进行或操作。

在还原原始数字时,我们要反转该过程。我们将字节向移动4位,这会将原始的number2移回其原始位置,然后我们使用 & 0xF 掩码除任何其他位。

number1 的位已经在正确的位置上(因为我们从未将它们移动),所以我们只需要再次使用 & 0xF 掩码除其他位即可。

在执行此操作之前,请确保这些数字在 0..9 范围内,或者(如果您不关心它们是否超出范围)可以通过和 0xF 进行 AND 运算将它们限制为 0..15:

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

谢谢,这比我原来的代码整洁多了。我还不熟悉位运算符,所以感谢您的解释。 - Robby Smet
我仍在思考掩码“0xF”的工作原理。 - Nick Peelman

4
这基本上应该可以工作:
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接