1

既存のコードでは、特定の失敗ケースにはいくつかの「理由」があります。これらの「理由」は、次のように#定義されています。

#define STRING_NOT_FOUND   (1 << 0)
#define STRING_INVALID     (1 << 1)
#define STRING_TOO_LARGE   (1 << 2)
...etc

これらは関数を使用して設定されますsetFailureReason(int reason);

以下に示すように、数値を使用する場合と比較して、これらの定数を定義するときにシフト演算子を使用する利点は何ですか。

#define STRING_NOT_FOUND   1
#define STRING_INVALID     2
#define STRING_TOO_LARGE   4
4

4 に答える 4

4

1 << 24ほとんどの人が知らない 16777216 に到達すると、より便利になります。

この特定のケースでは、それが「ビットフィールド」である理由がまったくわかりません。 and/or とSTING_NOT_FOUND同時にすることができます。STRING_INVALIDSTRING_TOO_LARGE

そして、適切なC++を使用することになりますenum(Cでも、それが推奨されます)。

于 2013-05-17T07:01:46.720 に答える
3

これは主に、エラー コードが値の論理和 (VALUE_A | VALUE_B) が可能なビット フィールドを表す場合に使用されます。

シフト演算子を使用すると可読性が向上し、誰かが新しいエラー コードを挿入して既存のビットの組み合わせ (たとえば 5) を使用するのを防ぐことができます。

間違っているかもしれません:

#define STRING_NOT_FOUND    1
#define STRING_INVALID      2
#define STRING_TOO_LARGE    4
#define STRING_SOMETHING_KO 5

多分よくなる:

#define STRING_NOT_FOUND    (1 << 0)
#define STRING_INVALID      (1 << 1)
#define STRING_TOO_LARGE    (1 << 2)
#define STRING_SOMETHING_KO (1 << 3)
于 2013-05-17T07:03:34.647 に答える
1

明らかな違いは、この演算子を使用すると、次の 2 の累乗 (1,2,4,8,16,32, ...)。最初のものは短く (log10 n 対 log10 2^n)、ほぼ間違いなく理解しやすいものです。

DevSolar は、ビット数を知ることについても非常に重要な点を指摘しました。個人的には 2 のべき乗から 16 までのすべてのべき乗を覚えているので、あまり考えたことはありません。

また、C++ では const または constexpr 変数が優先されるか、Mats が提案したように列挙型が優先されることに注意してください。

于 2013-05-17T06:59:39.403 に答える