0

私はそれらをビットマスクすることによっていくつかのオプションを追跡したいと思い、この回答からビットマスク値を借用しましたが、それらは一緒に機能していないようです。

#include <iostream>

#define OP1 0x00003FFFUL
#define OP2 0x00007FFFUL
#define OP3 0x0000FFFFUL

int main() {
        unsigned long params = 0; // .
        params |= OP3;
        if ( (params & OP1) == OP1)
                std::cout << "Whoa. Lame masking\n";
}

それはタイプの問題ですか、それともこの方法を一度に複数のオプションを保持するために使用することはできません(OP1、OP2、およびOP3の両方が同じままである必要がありますparams)?

4

5 に答える 5

4

オプションについては、次のような他のマスク、つまりオーバーラップしていないマスクを使用する必要があります。

   #define OP1 0x000000FUL
   #define OP2 0x00000F0UL
   #define OP3 0x0000F00UL

または(この場合、使用可能なビットと同じ数のオプションを保存できます):

   #define OP1 0x0000001UL
   #define OP2 0x0000002UL
   #define OP3 0x0000004UL
   //ETC...

OP3が設定されている場合はOP1とOP2が含まれるため、マスクが正しく機能することはありません(OP2を使用する場合も同様で、OP1が暗示されます)。

     FFFF = 1111111111111111
  &  3FFF = 0011111111111111
     -----------------------
     3FFF = 0011111111111111

貼り付けた例のマスクは、ULの最後のビットを推定することを目的としています。

于 2011-06-05T20:33:53.320 に答える
2

0xFと0x3の値は何だと思いますか?

于 2011-06-05T20:26:57.657 に答える
2

すべての「オプション」があります。問題は、OP1、OP2、およびOP3のビットがオーバーラップしていることです。OP3には、OP1とOP2のすべてのビットも設定されています。したがって、OP3&OP1はOP1に等しく、OP3&OP2はOP2に等しくなります。したがって、混乱。OP1 = 1、OP2 = 2、OP3 = 4の場合、これは当てはまりません。次に、フラグを次のように設定する必要があります

params |= OP1 | OP2 | OP3

ただし、OP1、OP2、およびOP3を提供したものにする必要がある場合は、ビットマスキングコードに問題はありません。

于 2011-06-05T20:28:21.697 に答える
2

この実装は、表示されていない他の処理が行われていない限り、おそらく奇妙です(別の質問から取得されているため、可能性は低いと思われます)。より良い解決策は、ビットマスクを列挙することです。何かのようなもの:

enum values {
    aaa = 1 << 0,
    bbb = 1 << 1,
    ccc = 1 << 2,
    ab = aaa | bbb,
    ac = aaa | ccc,
    abc = aaa | bbb | ccc,
    bc = bbb | ccc, };

その後、次のように使用できます。

unsigned int var = abc;
if (var & aaa) {
    cout << "OK";
}

'OK'を出力します

これにより、必要になる可能性のある重複する値が得られると同時に、それらの間の関係が明確に定義されます。あなたがまだもっと凝ったものになりたいなら、あなたはすることができます:

namespace blah {
enum values {
    aaa = 1 << 0,
    bbb = 1 << 1,
    ccc = 1 << 2,
    ab = aaa | bbb,
    ac = aaa | ccc,
    abc = aaa | bbb | ccc,
    bc = bbb | ccc,
};
}

これにより、次のように使用できるようになります。

unsigned int var = blah::abc;
if (var & blah::aaa) {
    cout << "OK";
}

これも「OK」を出力します

これは、uintの全幅とフラグの多くの組み合わせを使用している場合に便利です(メインの名前空間が乱雑になることはありません)。

于 2011-06-05T20:50:52.240 に答える
1

パラメータを初期化していない。

試す:

unsigned long params = 0;

于 2011-06-05T20:18:47.407 に答える