我有一个狡猾的小问题,我认为我提出的解决方案远比需要的解决方案困难得多。
问题是我有两个字节。第一个字节的前两位将被删除(因为该值为小端,这些位实际上位于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;
)答案 0 :(得分:1)
您无需屏蔽掉移位会丢弃的位。而且您不必手动传输这些位。所以它变成了这样:(未经测试)
int result = (secondByte << 6) | (firstByte & 0x3F);