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