我有两个数字(从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
发布于 2013-04-25 20:18:17
忘记所有的位数组的东西。
只需执行以下操作:
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进行are运算,将它们限制为0..15:
byte result = (byte)((number1 & 0xF) | ((number2 & 0xF) << 4));发布于 2013-04-25 20:18:25
这基本上应该是可行的:
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;
}https://stackoverflow.com/questions/16214497
复制相似问题