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

时间:2011-06-03 02:12:41

标签: 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个总插槽。每个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。

1 个答案:

答案 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位用于该编号。