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