このビットマスクの概念全体がよくわかりません。
私がマスクを持っているとしましょう:
var bitMask = 8 | 524288;
これが8
と524288
を組み合わせて524296
を取得する方法であることを理解できません。
しかし、どうすれば他の方法に進むことができますか?ビットマスクに8
や524288
が含まれているかどうかを確認するにはどうすればよいですか?
もう少し複雑にするために、私が持っているビットマスクが18358536
であり、8
と524288
がそのビットマスクにあるかどうかを確認する必要があるとします。いったいどうすればいいの?
上手
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 に興味があるかもしれません。
私はかなり確信しています (A & B)==B
ここで、A
はビットマスクであり、B
は確認したいことをすべて実行します。
例:
if((18358536 & 8) == 8)
{
// mask contains 8
}
まず、ビットマスクは整数ではなくビットを操作するためのものです。 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 */ }
あなたは読むことができます この記事のビットマスクに関するすべて