1

我有一个狡猾的小问题,我认为我想出了一个比需要的解决方案要困难得多的解决方案。

问题是我有两个字节。第一个字节的前两位将被删除(由于值是小端序,这些位实际上位于 16 位值的中间)。然后将第二个字节的最低有效两位移动到第一个字节的最高有效位位置,以代替被移除的位。

我的解决方案如下:

byte firstByte = (byte)stream.ReadByte(); // 01000100
byte secondByte = (byte)stream.ReadByte(); // 00010010
// the first and second byte equal the decimal 4676 in this little endian example

byte remainderOfFirstByte = (byte)(firstByte & 63); // 01000100 & 00111111 = 00000100

byte transferredBits = (byte)(secondByte  << 6); // 00010010 << 6 = 10000000

byte remainderOfSecondByte = (byte)(secondByte >> 2); // 00010010 >> 2 = 00000100

byte newFirstByte = (byte)(transferredBits | remainderOfFirstByte); // 10000000 | 00000100 = 10000100
int result = BitConverter.ToInt32(new byte[]{newFirstByte, remainderOfSecondByte, 0, 0}, 0); //10000100 00010000 (the result is decimal 1156)

有没有更简单的方法*来实现这一目标?*不那么冗长,也许是我缺少的内置函数或技巧?(除了在同一行同时执行 & 和 <<)

4

1 回答 1

1

您不必掩盖移位无论如何都会丢弃的位。而且您不必手动传输这些位。所以它变成了这样:(未测试)

int result = (secondByte << 6) | (firstByte & 0x3F);
于 2012-09-04T08:18:08.203 回答