我要做的是将一个字节的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个总插槽。每个Slot的数值可以是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
第3个插槽位为6,0x40到0x5F
第4个插槽是第7位,0x60到0x7F
第5个插槽是第8位,0x80到0x9F
等等
我将如何在C#中执行此操作。
每个插槽将有0-31个,(256/8)= 8个总插槽。
理论上,如果需要,我最多可以有6个插槽,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个额外的插槽我可以使用,但我会忽略它们......
现在将其从无符号整数分解为部分是下一个目标。
到目前为止,以快速的方式感谢所有帮助。
EDITED
我改回来了,显然我最多只能有28个部分
我现在遇到的问题是转换回他们的部分。现在它没有按照我想要的方式改变,根据数组,当第一个应该是25时,它将它们全部设置为31。
答案 0 :(得分:1)
如果每个插槽可以有0-31,则每个插槽需要5位。您可以在32位整数中插入6个插槽,然后每行需要一个整数。
看一下C# Operator Reference,对位操作特别有用的运算符是|
,&
,<<
,>>
。
第一个时隙是1到4位,0x0到0x1F
第二个插槽是第5位,0x20到0x3F
第3个插槽位为6,0x40到0x5F
第4个插槽是第7位,0x60到0x7F
第5个插槽是第8位,0x80到0x9F
这不是位如何工作,每个插槽需要一个5位的独立组。除非每行中只有一个数字为非零,否则在这种情况下,您需要3位来指示哪个插槽具有该编号,以及5位用于该编号。