从第一个字节中删除位,然后重新加入这些位

时间:2012-09-03 22:49:16

标签: c# bit-manipulation

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

问题是我有两个字节。第一个字节的前两位将被删除(因为该值为小端,这些位实际上位于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)

有没有更简单的方法来实现这一目标? *更简洁,也许是一个内置的功能或技巧,我错过了? (除了在同一行上同时执行&amp;和&lt;&lt;

1 个答案:

答案 0 :(得分:1)

您无需屏蔽掉移位会丢弃的位。而且您不必手动传输这些位。所以它变成了这样:(未经测试)

int result = (secondByte << 6) | (firstByte & 0x3F);