Rob*_*met 4 c# byte bit bitarray
我有两个数字(从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];
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我有ArgumentOutOfBoundsExceptions
忘记所有那些比特币的东西.
这样做:
byte result = (byte)(number1 | (number2 << 4));
Run Code Online (Sandbox Code Playgroud)
并让他们回来:
int number1 = result & 0xF;
int number2 = (result >> 4) & 0xF;
Run Code Online (Sandbox Code Playgroud)
这通过使用<<和>>位移运算符来工作.
在创建字节时,我们number2向左移位4位(用0填充结果的最低4位)然后我们使用|to或那些具有未移位位的位number1.
恢复原始数字时,我们会颠倒过程.我们将字节右移 4位,将number2原始位置放回原位,然后我们& 0xF用来屏蔽掉任何其他位.
这个位number1已经处于正确的位置(因为我们从未移动它们)所以我们只需要屏蔽其他位,再次使用& 0xF.
在执行此操作之前,您应该验证数字是否在0..9范围内,或者(如果您不在乎它们是否超出范围),您可以通过使用0xF将它们约束为0..15:
byte result = (byte)((number1 & 0xF) | ((number2 & 0xF) << 4));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3450 次 |
| 最近记录: |