C# 从3个字节中生成一个最大值为31(5位)的16位整数

C# 从3个字节中生成一个最大值为31(5位)的16位整数,c#,bit-manipulation,C#,Bit Manipulation,我想从3个小端字节中得到一个16位的值,最大值为31,这意味着它们最多有5个设置位。如何获取字节的最后5位,然后将它们全部放在一起 e、 g.字节:0011111 0010101 0011100到111111 0101111000 我试过了,但我想我只是在重写我的旧部分 cp = (bar << 3) | (bag >> 2) | (bab >> 7); 您并没有覆盖位,而是在将它们组合在一起之前将位从值中移出。bag>>2只保留原文件的三位,bab>>7将

我想从3个小端字节中得到一个16位的值,最大值为31,这意味着它们最多有5个设置位。如何获取字节的最后5位,然后将它们全部放在一起

e、 g.字节:0011111 0010101 0011100到111111 0101111000

我试过了,但我想我只是在重写我的旧部分

cp = (bar << 3) | (bag >> 2) | (bab >> 7);

您并没有覆盖位,而是在将它们组合在一起之前将位从值中移出。bag>>2只保留原文件的三位,bab>>7将所有五位加上两位移出

将值向左移动:

cp = (bar << 10) | (bag << 5) | bab;
要在右侧为其他值腾出空间:

bar << 10  -11111----------
bag << 5   ------10101-----
bab        -----------11100

这段代码给我带来了这样的结果:其中bar和bag=31 11111:/难怪我这么困惑。我用来查看二进制文件的十六进制编辑器以不同的方式显示它,但它仍然具有相同的值32444。所以这个代码实际上是有效的。非常感谢@aaro4130:该值以小尾端格式存储,因此两个字节00000000 011111100是16位值011110000000。嘿,我喜欢下行。。感谢您否决了一个合理的问题,这是一位想要扩大他们对位转换工作原理的了解的人提出的:|