【问题标题】:Combine 2 numbers in a byte将 2 个数字组合成一个字节
【发布时间】:2013-04-19 07:59:03
【问题描述】:

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

【问题讨论】:

    标签: c# byte bit bitarray


    【解决方案1】:

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

    这样做:

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

    然后让他们回来:

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

    这通过使用&lt;&lt;&gt;&gt; 位移运算符来工作。

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

    当恢复原始数字时,我们颠倒了这个过程。我们将字节 移动 4 位,将原始 number2 放回其原始位置,然后我们使用 &amp; 0xF 屏蔽任何其他位。

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

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

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

    【讨论】:

    • 谢谢,这比我的干净多了。我还是位运算符的新手,所以感谢您的解释。
    • 我还在思考掩码“0xF”的工作原理
    【解决方案2】:

    这应该基本上可以工作:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2015-04-13
      • 2019-07-19
      • 2021-03-14
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多