【发布时间】:2012-08-28 14:26:09
【问题描述】:
我有一个狡猾的小问题,我想我已经想出了一个比需要的更困难的解决方案。
问题是我有两个字节。第一个字节的前两位将被删除(由于值是小端,这些位实际上位于 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)
有没有更简单的方法*来实现这一点? *不那么冗长,也许是我缺少的内置函数或技巧? (除了 & 和
【问题讨论】:
-
为什么不直接转换为
short,然后进行移位,然后再转换回两个单独的字节? -
去掉的位在16位值的中间
-
两个问题马上开始; 1)您的代码无法编译(有几个地方不会将 int 隐式转换为字节,因此必须添加强制转换),最后一行缺少右括号和参数。 2) 结果是 1156,而不是 4228,除非我的更改使其编译搞砸了……
-
我也得到 1156。您可能会发现在位摆弄时使用十六进制常量更容易。此外,在移位之前不需要 & 的第二个字节;无论如何,最低有效位都会掉下来。
-
你是对的,应该是 1156。我已经编辑了这个问题,所以它可以编译。
标签: c# bit-manipulation