web-dev-qa-db-ja.com

ビットマスクにビットが含まれているかどうかを確認するにはどうすればよいですか?

このビットマスクの概念全体がよくわかりません。

私がマスクを持っているとしましょう:

var bitMask = 8 | 524288;

これが8524288を組み合わせて524296を取得する方法であることを理解できません。

しかし、どうすれば他の方法に進むことができますか?ビットマスクに8524288が含まれているかどうかを確認するにはどうすればよいですか?

もう少し複雑にするために、私が持っているビットマスクが18358536であり、8524288がそのビットマスクにあるかどうかを確認する必要があるとします。いったいどうすればいいの?

18
Nicolai

上手

if (8 & bitmask == 8 ) {
}

ビットマスクに8が含まれているかどうかを確認します。

より複雑

int mask = 8 | 12345;
if (mask & bitmask == mask) {
   //true if, and only if, bitmask contains 8 | 12345
}

if (mask & bitmask != 0) {
   //true if bitmask contains 8 or 12345 or (8 | 12345)
}

列挙型、特に FlagsAttibute に興味があるかもしれません。

32
tschmit007

私はかなり確信しています (A & B)==Bここで、Aはビットマスクであり、Bは確認したいことをすべて実行します。

例:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}
6
Alex

まず、ビットマスクは整数ではなくビットを操作するためのものです。 1と0だけを扱うと、より複雑な数値よりもはるかに理解しやすくなります。

だから例えば:

1000110000010000100001000 = 18358536 // in binary.

0000010000000000000000000 = 524288   // in binary.

0000000000000000000001000 = 8        // in binary.

0000010000000000000001000 = 524296   // in binary.

これにより、整数8は右側から4番目のビットであり、他のビットはマークされていないことが明らかであるため、8に524288(20番目のビットのみ)を追加すると、4番目と20番目のビットがtrueであるとマークされます。そのため、整数用に予約されたメモリ内の同じスペースを使用して、いくつかのブールプロパティを定義する複数のフラグを保持できます。

Alexが既に説明したように、ビットごとのAND演算子を使用して、ビットマスクで使用可能なフラグがあるかどうかを確認できます。

if ((mask & flag) == flag) { /* mask has flag set as true */ }

あなたは読むことができます この記事のビットマスクに関するすべて

4
Astrus