2011-06-03 63 views
0

我想要做的是将一个字节的总数值256分配到它们的计数器部分。将32位字节拆分为对应部分

我们所知道的是,在二进制:

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
3号槽是位6,0x40的至0x5F的
第四时隙是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个额外的插槽,我可以使用,但我会忽略它们...

现在将它从无符号整数分解成它们的部分是下一个目标。

感谢迄今为止以快速的方式提供的所有帮助。

EDITED

我又改了回来,显然我最多只能有28件

我现在已经是转换回他们的部分问题。现在它不按我想要的方式转移,根据阵列,第一个应该是25时,它将它们全部设置为31。

+3

6 * 6虽然是36? – 2011-06-03 02:14:07

+0

我的不好耶你的权利。我的目标是让我可以做一个5乘5的网格,总共最多32位。真的,我只需要25个。 – Benjamin 2011-06-03 02:17:49

+0

尽管我注释到只有5x5的概念,但它仍然在缓冲区中的255,255,255,255。这应该是不正确的 – Benjamin 2011-06-03 02:33:40

回答

1

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

看一看的C# Operator Reference,对位操作尤其有用的运营商|&<<>>

第一时隙将是比特1到4,0x0到0x1F的

第二时隙将是位5,0x20至0x3F的

第三时隙将是6位,0x40的至0x5F的

第四时隙是7位,0X60到0x7F

第五时隙将是比特8,0x80到0x9F

这不是如何工作,你需要一个单独的组每个插槽5位。除非每行中只有一个数字不为零,在这种情况下,您需要3位来指示哪个插槽具有该编号,以及该位数是5位。

+0

我上面修改的代码用于给我我需要的无符号整数。现在我只需要使它可以恢复到他们的插槽=) – Benjamin 2011-06-03 02:39:47

+0

@Benjamin:你的新代码有一些主要问题。很抱歉,如果每个插槽的值都在0-31之间,则无法从单个32位整数中获取多于6个的插槽。为了逆转你所做的事情,只需右移相应的位置并屏蔽这些位,比如'values [i] =(number >> places)& 0x1F;' – 2011-06-03 02:44:18

+0

好吧,那么显然我可以做到这一点,总共有27个时隙最大然后。因为前6位。除此之外它会起作用。 – Benjamin 2011-06-03 03:01:18