C# でビットマスクを使用する

Saad Aslam 2023年10月12日
C# でビットマスクを使用する

この投稿では、C# でビットマスクを使用する方法について説明します。 最も重要なことは、この割り当てを行うためのさまざまな方法がたくさんある場合でも、自分がやっていることの背後にある一般的な考え方を理解することです.

ビットマスクを利用するには、メモリ内のビットを操作することに注意する必要があります。

C# でビットマスクを使用する

C# にはさまざまな演算子があり、そのほとんどはビット演算子と呼ばれます。 これらの演算子は、メモリ内のビット レベルで操作を実行します。

ビット演算子とその記号は次のとおりです。

  1. & 記号で示される演算子は、AND 演算子です。
  2. | で示される演算子 記号は OR 演算子です。
  3. ~ 記号で示される演算子は、NOT 演算子です。
  4. ^ 記号で示される演算子は、XOR 演算子です。
  5. << 記号で示される演算子は 左シフト 演算子です。
  6. >> 記号で示される演算子は、右シフト AND 演算子です。

AND 演算子の動作は次のとおりです。

X  Y  Res
0  0  0
0  1  0
1  0  0
1  1  1

Res は出力で、X と Y は入力の可能性です。

OR 演算子の動作は次のとおりです。

X  Y  Res
0  0  0
0  1  1
1  0  1
1  1  1

Res は出力で、X と Y は入力の可能性です。

NOT 演算子の働きは次のとおりです。

X  Y
1  0
0  1

Yは出力、Xは入力の可能性です。

XOR 演算子の動作は次のとおりです。

X  Y  Res
0  0  0
0  1  1
1  0  1
1  1  0

Res は出力で、X と Y は入力の可能性です。

left-shift 演算子の動作は次のとおりです。

x = 010110011

2つの左シフトを指定すると、ビットは 2 ビット スペース左に移動します。

x << 2

x は次のようになります。

x = 011001100

そして右側に、2つの新しい 0 ビットが追加されます。

右シフト演算子の動作は次のとおりです。

x = 010110011

右に 2 回シフトすると、ビットは左に 2 ビット スペース移動します。

x >> 2

x は次のようになります。

x = 000101100

そして左側に、2つの新しい 0 ビットが追加されます。 これで、ビットごとの演算子の動作がわかったので、入力にビットマスクを適用できます。

ビットマスクに使用される最も一般的な演算子は AND 演算子です。 両方の入力が 1 の場合に出力が 1 になるため、どのビットが 1 でどのビットが 0 であるかを確認するために使用されます。

以下は、マスクされた最後の 4 ビットを評価するコードです。

using System;

namespace HelloWorld {
  class Program {
    static void Main(string[] args) {
      char x = '2';
      int y = 0b00001111;
      int z = x & y;
      Console.WriteLine(z);
    }
  }
}

メモリに 1 バイトのスペースを確保するために、char 型の変数 xint 型の変数 y を作成しました。

最後の 4 ビットが 1 である対応する 10 進数値のバイナリ バージョンは、0b00001111 として書き込まれます。

int z= x&y; と書かれた行 ビット単位の and を計算し、結果を z という名前の変数に保存します。 z 変数は int データ型であるため、10 進数形式で表された結果を見ることができます。

操作は次のとおりです。

x = 01111101

    y = 00001111

    z = x& y = 00001101

これは目に見えるので、x 変数は最新の 4 ビットを除いてすべて取り除かれていることがわかります。 そのために、AND 演算子を使用しました。

同様に、OR 演算子を使用してビットを結合することもできます。

ビットについて十分な知識があれば、簡単にビットを操作して暗号を生成できることがわかるはずです。

著者: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn