将32位字节拆分为对应字节



我要做的是将一个字节的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位来指示该数字。

相关内容

  • 没有找到相关文章

最新更新