「ビットマスク」がなぜこのように呼ばれるのですか?
私はそれらが主にビット単位の操作に使用され、ビットマスクの使用が個別の変数の使用よりも効率的であることを知っています。
しかし、私の質問は、ビットマスクが発明された理由と時期です。初期のコンピューティング以来使用されていましたか?ITドメイン内にビットマスク以外のタイプの「マスク」はありますか?
「ビットマスク」がなぜこのように呼ばれるのですか?
私はそれらが主にビット単位の操作に使用され、ビットマスクの使用が個別の変数の使用よりも効率的であることを知っています。
しかし、私の質問は、ビットマスクが発明された理由と時期です。初期のコンピューティング以来使用されていましたか?ITドメイン内にビットマスク以外のタイプの「マスク」はありますか?
回答:
(顔の種類の)マスクは、顔の一部を覆い、他の部分が透けて見えるようにするものです。この用語は計算の類推で使用されます。ビットマスクはビットセット内の一部のビットを覆い(フィルターで取り除き)、他のビットを通過させます。
ITドメイン内にビットマスク以外のタイプの「マスク」はありますか?
私の頭のすぐ上では、画像処理でマスクが頻繁に使用されます。同様の概念です。何をマスクし、何を通過させるかを示す白黒の画像を作成します。
ビットマスクを使用して、ビットフィールドの一部のビットをマスクし、他のビットを公開します。
initial value: 011011001
bit mask.....: 111110000
result value.: 011010000
これは、論理ゲート(AND、OR ...)またはトランジスタを備えた電子機器、またはリレーを備えた電気機械で計算する前に使用されてきました。
ビットマスクはものすごく古いです。私は最初のものへの参照を見つけることができませんでしたが、それらは8ビットプロセッサの出現によって確かに人気があり、おそらく4ビットプロセッサでも使用されました。
ビットマスクの背後にある考え方は、ビット単位の並列処理を利用することです。8ビットコンピューターは、単一のネイティブワードにまとめられている場合(つまり、レジスターに収まる場合)、8ビットに対して同じビット演算を一度に実行できます。
名前はマスキングに由来します。マスキングは、やり取りしたくない領域をカバーする一般的なアプローチです。たとえば、壁の領域をマスクするためにこのステンシルを検討してください(ステンシルは、パターンを表示するためにペイント後に移動されています)
マスクは写真でも使用され、「ステンシル」ではなく「覆い焼き」という用語で使用されます。マスクを使用して、印刷中に一部の光を隠し、領域を明るくすることができます。
この用語は、フォトリソグラフィーでも直接使用されます。フォトリソグラフィーは、集積回路の作成に使用される技術です。マスクは、チップ上に塗られたフォトレジストに光が到達するのを防ぎます。フォトレジストは、チップ上の魅力的なパターンにつながるパターンを作成します。(下の画像は、Intel 8080Aプロセッサのマスクの1つです。興味がある場合)
同様に、ビットマスキングでは、操作する単語の部分を選択し、残りのビットをすべてマスクします。以下の例では、「and」操作を使用して、3番目、4番目、および8番目のビットのみが透けて見えるように入力をマスクします。残りは「マスク」されているため、0になります。私が使用するマスクは00110001
です。#
0を.
表し、1 を表すことで以下に示します。これにより、ビットマスクの視覚的外観は上の物理マスクの外観に似ているため、「選択されたビット」行を表示します。 「選択されたビット」は実際に発生する論理的な操作ではありません...プロセッサは実際に1ステップで入力ANDマスクから出力に移行しますが、視覚的なイメージを明確にすると思います)
Input 10010111
Mask ##..###. (aka 00110001)
-----------------------
(selected) 01 1
Input AND Mask 00010001
前述したように、ビットマスクはプロセッサの生産性を大幅に向上させるため、非常に古いものです。4ビットプロセッサでは、プロセッサを4倍高速化できます。8ビットプロセスの場合、または8倍高速にすることができます(もちろん、ビット単位の操作のみ)。
これの1つの魅力的な使用法はチェスエンジンです。チェス盤には64個のマスがあります。最新のエンジンには64ビット整数があります。これは非常に便利な運であるため、チェスエンジンはしばしばそれを活用します。それらには、ピースの位置を含むいわゆる「ビットボード」があります。これにより、1ステップですべてのポーンの動きを探すなど、あらゆる種類の最適化を行うことができます。
英語での最も一般的な使用法では、マスクは何かを隠すデバイスです。スクリーン印刷については別の回答で言及されています。ペイントテープは、何かを「マスク」して、ペンキが付かないようにします。PCボード上のはんだマスクは、はんだ付けする領域とはんだ付けしない領域を「マスク」します。
「ビットマスキング」の場合、一部のビットは「非表示」または無視されるため、関心のある他のビットをより簡単に操作したり、単純に表示したりできます。
ビットマスキングは単に「古い」手法ではなく、最も初期のプロセッサから知っている限りでは、すべてではないにしてもほとんどの機械命令で基本的な操作です。通常、これは「このレジスタのビットパターンを使用して他のレジスタのビットをマスクする」という形式です。
ビット・マスクと同様であり、スクリーン印刷。結果に引き継ぐ特定のビット位置を選択します。
source value = 42 -> 00101010b
mask = 51 -> 00110011b
result 42&51 = 00100010b -> 34
マスクのもう1つの意味は、ユーザーがデータを入力できるグラフィカルユーザーインターフェイスのページです。
ビットマスクは、いくつかの理由で発明されました。
ビットをオンにするOR結合またはビットをオフにするAND結合のビットパターンの表示を見ると、マスクのように見えます。
最も一般的なマスク(ビットマスクに基づく)はイメージマスクです(冒頭に記載したリンクを参照)。
bool
や、各フラグを別々のバイトに持つ他の方法よりも、フラグのセットを渡す適切で効率的な方法です。それは効率的のようなものを行うことが可能となるif (x & (FLAG_A | FLAG_B))
の代わりにif (xflags[FLAG_A] || xflags[FLAG_B])
。特に、マスクが定数でない場合。マスクを整数として渡すことができるのは、チェックするフラグのリストを渡すよりもはるかに安価です。したがって、メモリとキャッシュが無制限であっても、場合によってはビットセットとマスクを使用する方がはるかに効率的です。