2016-03-03 287 views
0

我想转换从阵列采取十进制整数和转换成4位二进制和存储每个所述位的成阵列在c#转换十进制整数为4位二进制

static void Main() 
{ 
    BinaryInput a = new BinaryInput(); 
    int[] input = { 7, 0, 0, 0, 2, 0, 4, 4, 0 }; 
    int x; 
    int[] bits = new int[36]; 
    ArrayList Actor = new ArrayList(); 
    for (int i = 0; i < input.Length; i++) 
    { 
     x = (int)input[i]; 
     string result = Convert.ToString(x, 2); 
     bits = result.PadLeft(4, '0').Select(c =>int.Parse(c.ToString())).ToArray(); 
     Actor.Add(bits); 
    } 
} 

ArrayListActor由9个阵列和每个阵列由二进制数的......但我想在单个阵列添加的每个二进制位的作为数组的单个元素或ArrayList的{0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0}

+0

这就是'BitArray'类的用途。如果你想要更优化一些东西,'BitVector32'可能也很方便,但是需要更多的工作。 – leppie

+0

顺便说一句4位整数称为半字节。 – leppie

回答

3

可以编写一个方法来获得这样的数字的“位”

private static IEnumerable<int> ToBitSequence(this int num, int size) 
{ 
    while (size > 0) 
    { 
     yield return num & 1; 
     size--; 
     num >>= 1; 
    } 
} 

然后,您可以通过以下方式使用它来获得所需的结果。

int[] input = { 7, 0, 0, 0, 2, 0, 4, 4, 0 }; 
var bits = input.Reverse().SelectMany(i => i.ToBitSequence(4)).Reverse(); 
Console.WriteLine(string.Join(",", bits)); 

结果

0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0

原因两个Reverse电话是因为ToBitSequence将首先返回最低有效位,因此通过以相反顺序提供数字,然后反转结果,您将从列表中的第一个数字开始,从最重要到最不重要的位开始。

这对于您目前正在执行的char,stringint之间的所有解析和格式设置来说更可取。

但是,如果你只是将Actor更改为List<int>,并且做Actor.AddRange(bits);也可以。

+1

他还需要认识到他可以放入输入数组的任何元素的最大数量是15,否则他会超过他在问题中设置的4位限制。非常好的答案btw – Kevin

+1

@Kevin其实我的实现让我们来设置“限制”,但你是正确的,超过15的数字将被截断,只取最后4个最不重要的位。尽管OP似乎表明所有数字都是单个十进制数字(0-9)。 – juharr

+0

建议将'int'更改为'BigInteger'并且每个人都会很开心:D – leppie

0

使用BitArray

BitArray b = new BitArray(new byte[] { x }); 
int[] bits = b.Cast<bool>().Select(bit => bit ? 1 : 0).ToArray(); 

这会给你的位,然后用

bits.Take(4).Reverse() 

在最显著为了率先拿到至少显著4位为每个号码。

+0

尽管这是一个更好的方式来将数字转换成比它的位数更多的实际问题是获取一系列“位”而不是一系列“比特”数组。 – juharr