2016-03-03 285 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