我要做的是将一个字节的256个总数值拆分为它们的计数器部分。
我们所知道的是,在二进制:
0001 1111 is 31
0011 1111 is 63
0111 1111 is 127
1111 1111 is 255
目标是这样做,如果我有一个5乘5网格
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
这给了我25个空位。每个插槽的数值可以为0-31。因此,每个插槽中的数值"4294967295"将为31,其中"0"在每个插槽中为0,所以我试图弄清楚在C#中如何移位位值。
所以如果我的网格中有:
1 3 0 0 0
0 0 0 0 0
0 0 5 0 0
0 0 3 0 6
第一个插槽将是位1到4,0x0到0x1F
第二个插槽将是位5,0x20到0x3F
第三个插槽将是位6,0x40到0x5F
第4个插槽将是位7,0x60到0x7F
第5个插槽将是位8,0x80到0x9F
等等
我该如何在C#中做到这一点。
每个插槽将有0-31个,(256/8)=总共8个插槽。
理论上,如果需要的话,我最多可以有32个插槽,在6x5或5x6的网格中。但现在我只需要5x5。
-编辑
byte[] values = new byte[]
{
25, 31, 31, 31, 31,
31, 31, 31, 31, 31,
31, 31, 31, 31, 31,
31, 31, 31, 31, 31,
31, 31, 31, 31, 31,
31, 31
};
Console.Clear();
uint number = 0;
for ( int i = 0; i < values.Length; i++ )
{
number |= (uint)(values[i] << i);
Console.WriteLine( number );
}
byte[] buffer = BitConverter.GetBytes( number );
for ( int i = 0; i < values.Length; i++ )
{
values[i] = (byte)((number >> i) & 0x1F);
}
Console.ReadLine();
当我这样做的时候,它给了我255,在每个插槽的缓冲区中,这就是我想要的。。。显然这就是我的目标。尽管我有8个额外的插槽可以使用,但我会忽略它们。。。
现在,下一个目标是将其从一个无符号整数分解为多个部分。
感谢您到目前为止提供的快速帮助。
已编辑
我把它换回来了,显然我最多只能有28个
我现在的问题是转换回它们的零件。现在它并没有按照我想要的方式改变,它将它们都设置为31,而根据数组,第一个应该是25。
如果每个插槽可以有0-31,那么每个插槽需要5位。您可以在一个32位整数中容纳6个插槽,然后每行需要一个整数。
看看C#运算符参考,对位操作特别有用的运算符有|
、&
、<<
、>>
。
第一个时隙是位1到4,0x0到0x1F
第二个插槽是位5,0x20到0x3F
第三个插槽将是位6,0x40到0x5F
第4个插槽将是位7,0x60到0x7F
第5个插槽将是位8,0x80到0x9F
比特不是这样工作的,你需要一个单独的组,每个插槽5个比特。除非每行中只有一个数字为非零,否则在这种情况下,您需要3位来指示哪个插槽具有该数字,而需要5位来指示该数字。