0

この質問は以下に基づいています: 64ビット整数のシフト 質問の起源は-私enumは異なるマスクを提示するを定義します。そして、結果を右にシフトした後、(マスク)で&変数を作成する必要があります。タイプは常にであるenumため、変数はとしても定義されています。ただし、ご覧のとおり、右の負の数をシフトする際に問題があります。それを解決するために何ができるでしょうか?enumintint

4

3 に答える 3

4

まず、enumタイプは常にではありませんint; C ++ 11では、強制的に符号なし型にすることもできます。そして第二に、基礎となるタイプがである場合でも、実際のリスクなしintに自由にキャストしたり、キャストしたりすることができます(そしてそうすべきです) 。unsignedたとえば、次のようにオーバーロードできoperator&ます。

MyEnum
operator&( MyEnum lhs, MyEnum rhs )
{
    return static_cast<MyEnum>(
        static_cast<unsigned>( lhs) & static_cast<unsigned>( rhs ) );
}

どこかの真ん中にある可能性のあるフィールドを抽出する場合:

int
getFieldX( MyEnum values )
{
    return static_cast<unsigned>(values & fieldXMask) >> fieldXOffset;
}

これにより、正しい動作が保証されます(そして、符号なしの値がシフトされるとint、値を失うことなくに変換されます)。

于 2013-01-31T09:20:00.253 に答える
1

unsigned long longシフトする前に、列挙の値を静的にキャストすることをお勧めします。これがあなたが使用できる最も安全なオプションだと思います。

于 2013-01-31T09:13:12.843 に答える
0

これを回避するには、最初にシフトを実行し、次にシフトされたマスクに対してANDを実行します。

于 2013-01-31T09:11:01.250 に答える