C# 将32位字节拆分为对应的字节

C# 将32位字节拆分为对应的字节,c#,byte,bit-manipulation,C#,Byte,Bit Manipulation,我试图做的是将一个字节的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,因此我试图

我试图做的是将一个字节的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
第四个插槽将是位7,0x60到0x7F
第五个插槽将是位8,0x80到0x9F

诸如此类

在C#中我将如何做到这一点

每个插槽将有0-31个(256/8)=总共8个插槽

理论上,如果需要,在6x5或5x6网格中,我最多可以有32个插槽。但现在我只需要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();
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();
单位数=0;
for(int i=0;ii)和0x1F);
}
Console.ReadLine();
当我这样做的时候,它给了我255,在每个插槽的缓冲区中,这是我想要的。。。显然这就是我的目标。即使我有8个额外的插槽可以使用,但我会忽略它们

现在,下一个目标是把它从一个无符号整数分解成几个部分

感谢所有的帮助,到目前为止,在一个快速时尚的方式

已编辑

我把它改回去了,显然我最多只能有28个零件


我现在的问题是把它们转换回各自的部分。现在它并没有按我希望的方式移动,它将它们全部设置为31,而根据数组,第一个插槽应该是25。

如果每个插槽可以有0-31,那么每个插槽需要5位。您可以在32位整数中放入6个插槽,然后每行需要一个整数

请查看,对位操作特别有用的运算符有
|
&

第一个插槽将是位1到4,0x0到0x1F

第二个插槽将是位5,0x20到0x3F

第三个插槽将是位6,0x40到0x5F

第四个插槽将是位7,0x60到0x7F

第五个插槽将是位8,0x80到0x9F


比特不是这样工作的,每个插槽需要一个单独的5比特组。除非每行中只有一个数字是非零的,否则在这种情况下,您需要3位来指示哪个插槽有数字,5位表示数字。

My bad yeah your right。我的目标是使它成为一个5乘5的网格,最多32位。实际上,我只需要25个总数。虽然,当我注释出只有5x5概念时,缓冲区中的值仍然是255、255、255、255。这应该是不正确的
+=
不是你想要的位操作。你的右边的Ben,如果我使用|=那么我可以有28个,这就是它应该的。我上面修改的代码可以给我我需要的无符号整数。现在我只需要把它们还原到它们的插槽=)@Benjamin:你的新代码有一些大问题。很抱歉,如果每个插槽的值在0-31之间,则无法从单个32位整数中获得超过6个插槽。要反转您所做的操作,只需右移适当的位数并屏蔽位,如
values[i]=(number>>places)&0x1F好吧,很明显我最多可以做27个插槽。因为前6位。本杰明:你没在听。如果每个插槽有32个可能的值,那么每个插槽自身需要6位。因此,我需要196位来完成我想要的。。。好吧,事实是我最多只需要0-3,因为在一种颜色中只有4个几乎像ARGB的模式,其中4个字节,为每种颜色定义0-255。所以,如果我能做到这一点,为0-3,应该给我32个总插槽权利???目标是将1个字节分解成4个部分,所以如果我有00111,这意味着插槽0=0,1=3,2=3,3=3