3

CreateMask()の機能は何をBitVector32しますか?マスクが何なのかわかりませんでした。

次のコード行を理解したいと思います。create maskはビットをtrueに設定するだけですか?

  // Creates and initializes a BitVector32 with all bit flags set to FALSE.
  BitVector32 myBV = new BitVector32( 0 );

  // Creates masks to isolate each of the first five bit flags.
  int myBit1 = BitVector32.CreateMask();
  int myBit2 = BitVector32.CreateMask( myBit1 );
  int myBit3 = BitVector32.CreateMask( myBit2 );
  int myBit4 = BitVector32.CreateMask( myBit3 );
  int myBit5 = BitVector32.CreateMask( myBit4 );

  // Sets the alternating bits to TRUE.
  Console.WriteLine( "Setting alternating bits to TRUE:" );
  Console.WriteLine( "   Initial:         {0}", myBV.ToString() );
  myBV[myBit1] = true;
  Console.WriteLine( "   myBit1 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit3] = true;
  Console.WriteLine( "   myBit3 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit5] = true;
  Console.WriteLine( "   myBit5 = TRUE:   {0}", myBV.ToString() );

これの実用的なアプリケーションは何ですか?

4

4 に答える 4

1

興味深いビットを簡単に取得するために使用できるマスクを返します。

マスクとは何かについては、ウィキペディアをチェックすることをお勧めします。

つまり、マスクは、関心のあるビットの場合は1、その他のビットの場合は0の配列の形式のパターンです。

01010のようなものがあり、最後の3ビットを取得することに関心がある場合、マスクは00111のようになります。次に、01010と00111でビット単位のANDを実行すると、ANDのみであるため、最後の3ビット(00010)が取得されます。両方のビットが設定されていて、最初の3つ以外のビットがマスクに設定されていない場合は1です。

例は理解しやすいかもしれません:

BitVector32.CreateMask() => 1 (binary 1)
BitVector32.CreateMask(1) => 2 (binary 10)
BitVector32.CreateMask(2) => 4 (binary 100)
BitVector32.CreateMask(4) => 8 (binary 1000)

CreateMask(int)指定された数値に2を掛けたものを返します。

:最初のビットは最下位ビット、つまり最も右にあるビットです。

于 2009-09-15T11:02:16.763 に答える
1

BitVector32.CreateMask()は左シフト演算子(<<)の代わりになり、ほとんどの場合2が乗算されます(左シフトは円形ではないため、桁を失い始める可能性があります。詳細については、ここで説明します) 。

BitVector32 vector = new BitVector32();
int bit1 = BitVector32.CreateMask();
int bit2 = BitVector32.CreateMask(bit1);
int bit3 = 1 << 2;
int bit5 = 1 << 4;

Console.WriteLine(vector.ToString());
vector[bit1 | bit2 | bit3 | bit5] = true;
Console.WriteLine(vector.ToString());

出力:

BitVector32 {00000000000000000000000000000000} BitVector32 {00000000000000000000000000010111}

于 2011-09-28T10:37:50.770 に答える
0

この他の投稿リンクテキストを確認してください。また、CreateMaskは、指定された数値に2を掛けた値を返しません。CreateMaskは、32ビットワード内の特定の位置(通過するパラメーター)に基づいてビットマスクを作成します。これは、通常、x^2です。シングルビット(フラグ)について話します。

于 2010-10-20T20:08:07.637 に答える
0

私はこの質問に出くわし、正確に何をするのかを調べようとしましたCreateMask。現在の回答が私にとっての質問に答えているとは感じませんでした。いくつか読んで実験した後、私は私の発見を共有したいと思います:

基本的に、Maksymilianが言っていることは、ほとんど正しいです。「BitVector32.CreateMaskは、左シフト演算子(<<)の代わりであり、ほとんどの場合、2が乗算されます」。

<<は二項演算子であり、CreateMaskは引数を1つしか受け取らないため、。と同等の引数を追加したいと思いBitVector32.CreateMask(x)ますx << 1

ボーダーケース

ただし、2つの境界ケースの場合とBitVector32.CreateMask(x)同等ではありません。x << 1

  1. BitVector32.CreateMask(int.MinValue)
    InvalidOperationExceptionがスローされます。int.MinValueに対応し10000000000000000000000000000000ます。これは少し奇妙に思えます。特に、左端のビット(つまり、負の数)として1を使用する他のすべての値を考慮すると、問題なく機能します。対照的に:int.MinValue << 1例外をスローせず、0を返すだけです。

  2. 電話をかけるときBitVector32.CreateMask(0)(またはBitVector32.CreateMask())。これは1を返します
    (つまり、に00000000000000000000000000000000なります00000000000000000000000000000001)が
    、0<<1は0を返します。

2による乗算

CreateMaskは、ほとんどの場合、2による乗算と同等です。上記の2つの特殊なケースを除いて、左から2番目のビットが左端のビットと異なる場合は異なります。intは符号付きなので、左端のビットは符号を示します。そのシナリオでは、サインが反転します。たとえばCreateMask(-1)、(または11111111111111111111111111111111)は-2(または11111111111111111111111111111110)になりますが、CreateMask(int.MaxValue)(または01111111111111111111111111111111)も-2になります。

とにかく、あなたはおそらくこの目的のためにそれを使うべきではありません。私が理解しているように、BitVector32を使用する場合、実際には32ビットのシーケンスと見なす必要があります。それらがBitVector32と組み合わせてintを使用しているという事実は、おそらくそれが便利だからです。

CreateMaskはいつ役に立ちますか?

正直わかりません。ドキュメントと関数の引数の「previous」という名前から、ある種のシーケンスで使用することを意図しているようです。「CreateMask()を使用してシリーズの最初のマスクを作成し、CreateMask(int)を使用してすべての後続のマスク。」

ただし、コード例では、これを使用して最初の5ビットのマスクを作成し、その後、それらのビットに対していくつかの操作を実行します。左側のビットでいくつかのことを実行できるように、CreateMaskに32個の呼び出しを続けて書き込むことを彼らが期待しているとは想像できません。

于 2012-07-11T16:32:38.740 に答える