21

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

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

var bitMask = 8 | 524288;

これが、 and を組み合わせて を取得する方法であることを理解してい8ませ524288524296

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

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

4

3 に答える 3

43

良い

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に興味があるかもしれません。

于 2013-01-23T12:43:50.823 に答える
9

ビットマスク(A & B)==Bがどこにあるのか、確認したいことは何でもすべきだと確信しています。AB

例:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}
于 2013-01-23T12:44:53.633 に答える
7

まず、ビットマスクは整数ではなくビットを操作するためのものです。より複雑な数よりも、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 */ }

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

于 2018-05-31T07:45:24.683 に答える