5

我有两个数字(从 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

4

2 回答 2

7

忘记所有那些位数组的东西。

只需这样做:

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

并让他们回来:

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

这通过使用<<>>位移运算符起作用。

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

在恢复原始数字时,我们将过程颠倒过来。我们将字节右移4 位,将原始字节number2放回原来的位置,然后我们用它& 0xF来屏蔽任何其他位。

这个位number1已经在正确的位置(因为我们从来没有移动它们)所以我们只需要屏蔽其他位,再次使用& 0xF.

在执行此操作之前,您应该验证数字是否在 0..9 范围内,或者(如果您不关心它们是否超出范围)您可以通过与 0xF 进行与运算将它们限制为 0..15:

byte result = (byte)((number1 & 0xF) | ((number2 & 0xF) << 4));
于 2013-04-25T12:18:17.143 回答
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;
}
于 2013-04-25T12:18:24.567 回答