0

以下のようなC++コードでビット単位の&を使用できますか?このメソッドは、ビット演算の結果に基づいてブール値を返します。

bool SetValue( myType a )
{
    if( a & notMyType == notMyType )
    {
        return false;
    }

    if( a & newMyType == newMyType )
    {
        SendNew(a);
        return true;
    }

    if( a & oldMyType == oldMyType )
    {
        SendOld(a);
        return true;
    }
}
4

3 に答える 3

5

==&括弧を使用するよりも優先順位が高くなります。

a & notMyType == notMyType

として評価されます

a & (notMyType == notMyType)

したがって、代わりに次を使用する必要があります。

(a & notMyType) == notMyType

実際には、ビットごとのAND演算子(&)を使用していますが、論理AND演算子()を使用したいと考えている可能性があります&&

于 2012-06-17T21:01:54.260 に答える
3

簡単な答え:いいえ。

一般に、プリミティブ型ではないものに対してビット単位の演算を使用することは悪い考えと見なされます(とにかくそれが何を達成するかはわかりません)。さらに、ビット単位の演算が自然数ではないもので役立つことがわかったケースはめったに見られません。

于 2012-06-17T20:59:41.157 に答える
2

はい、いくつかの仮定と修正で問題ないかもしれません。

仮定:

  • MyType一体型です
  • 定数は通常、ビット値(1、2、4、...)またはそれらの意味的に自然な組み合わせです。

最後の比較はタイプミスのように見えます(1つのフラグを使用して選択し、別のフラグと比較します)。これは、いくつかの値の組み合わせでも機能する可能性がありますが、せいぜいばかげて混乱するでしょう。

また、演算子の優先順位を修正する必要があります。

a & flag == flag

本当に意味します

a & (flag == flag)

つまり、これがすべて不可欠であり、エキゾチックに過負荷ではないと仮定すると、

a & 1

つまり、

(a & 1) == 1

それはあなたが望んでいたものではありません。かっこを追加するか、単純に記述します

a & flag

フラグがtrueある場合にのみ、これがキャストされることを信頼します。この条件はブール値のようには見えませんが、C++はブール値への暗黙の変換を提供します。ゼロ値はに変換され、その他の値はに変換されます。aflagfalsetrue

于 2012-06-17T21:07:30.683 に答える