2012-01-30 6 views
13

このコード:BitArrayはビットを間違って返しますか?

BitArray bits = new BitArray(new byte[] { 7 }); 
foreach (bool bit in bits) 
{ 
    Console.WriteLine(bit ? 1 : 0); 
} 

は私に次のような出力が得られます。

11100000 

は、それが他の方法で回避すべきではありませんか?このように:

00000111 

これらの用語は、唯一のバイトの位置に言及しているが、私は、少しとビッグエンディアンがあることは承知しています。私が知る限り、彼らはビットに影響しません。

答えて

9

documentation for BitArray状態:

配列の最初のバイトはビット0〜7を表し、第二 バイトようにビット15を介して8を表し、。各バイトの ビットは最小のインデックス値を表し最下位: "バイト[0] & 1" "はバイト[0] & 2"、ビット0を表し、 "バイト[0] & 4"、ビット1を表し ビットを表します2、など。

ビットをインデックスするとき、慣例は最下位から開始します。これは、バイナリ表記で記述したときの右側です。ただし、配列を列挙するときは、インデックス0から開始するため、右から左の代わりに左から右に出力されます。だから、それは後方に向かっている。

例えば、ワード01011010 00101101(90 45)として索引付けされるであろう:

0 1 0 1 1 0 1 0 - 0 0 1 0 1 1 0 1 
----------------------- ----------------------- 
15 14 13 12 11 10 9 8  7 6 5 4 3 2 1 0 

そして、あなたはそれが最下位最初のパスので、あなたはnew byte[] { 45, 90 }としてコンストラクタに渡すことになります。印刷されると、インデックス順に:1011010001011010と表示されます。これは、元のバイナリ表記の逆です。

2

ドキュメンテーションは明示的ではありませんが、イテレータはLSBからMSBに反復すると思います。あなたがビットを印刷していない限り、私には合理的な音(個人的に!)。私はBitArray.GetEnumerator Methodを見ました。

2

いいえそれはビット配列であり、ビットとして表される数値ではありません。

ビット操作用にいくつかのメソッドが追加された通常の配列と同じです。ちょうどあなたがintの配列を持っていたかのように。あなたはそれが逆の順序であることを期待していないでしょう、それは単に位置によってそれを取る。

例:

番号(バイトで)ようBitArrayに変換出てくるだろう:それはちょうどとして相対値の位置を記憶しなく

2 = 01000000 
5 = 10100000 
8 = 00010000 

バイナリの数値以外の場合はそうです。ここ

コンストラクタを記述するリンクは、使用されている。

http://msdn.microsoft.com/en-us/library/b3d1dwck.aspx

のキーポイントである:

最初の値の配列要素内の数字は、ビットを 0〜31を表します。配列の2番目の数字はビット32〜63を表し、 などを表します。 各整数の最下位ビットは最も低い インデックス値表す:ビット0を表す "値[0] & 1"、 "値[0] & 2" は、 "値を[0] & 4" ビット1を表しビット2、など。

関連する問題