3

たとえば、通知には次のフラグがあります。

public static final int FLAG_AUTO_CANCEL = 0x00000010;

これは数値 16 の 16 進数です。値を持つ他のフラグがあります。

 0x00000020
 0x00000040
 0x00000080

毎回、2 のべき乗で増加します。これを 2 進数に変換すると、次のようになります。

 00010000
 00100000
 01000000
 10000000

したがって、ビットごとの演算子を使用して、どのフラグが存在するかなどを判断できます。これは、各フラグに含まれる 1 は 1 つだけであり、それらはすべて異なる場所にあるためです。

質問:

これはすべて完全に理にかなっていますが、使用しないのはなぜbooleansですか? これは単なる文体的なものですか、それともメモリや効率の利点はありますか?

編集:
それらを組み合わせることで、多くの情報を単一の に保存できることを理解していますint。これは、大量のパラメーターを渡す代わりに、単一のブール型値を多数渡すことができるようにするためだけに使用されますか? それを矮小化するつもりはありません。非常に便利ですが、他に利点はありますか?int

4

2 に答える 2

2

あなたが話しているのはBit Fieldと呼ばれるものです。利点の 1 つは、すべての情報を 1 つの変数に含めることができることです (ArrayList のようなオーバーヘッドはありません)。これは、関数シグネチャを整頓するのに役立ち、スタック操作が少なくなるため、効率性にいくつかの小さな利点がありますが、おそらくこれは追加のビットシフト操作によって相殺されるでしょう。さらに、追加の 7 バイトを無駄にするのではなく、(たとえば) 1 バイトを使用して 8 つのフィールドを格納できます。また、巧妙であれば、1 回の操作で複数のフラグ チェックを実行することもできます。

そうは言っても、個人的な好みでは、ブール値のリストがよりクリーンまたは好ましいと見なされる場合があります。ビットフィールドは、スペースが限られている組み込みシステムやそのような性質のシステムで最も一般的です。

あなたの編集に関して: フラグの値を int に格納していますが、それらは単なる参照定数です。それらを編集しているのではなく、それらのビットを単一のフィールドに (またはフィールドから) 貼り付けてますflags。整数。彼らがこのアプリケーションにビットフィールドを選んだ理由はよくわかりません。おそらく、スペースが限られたマイクロコントローラをプログラミングして育った誰かが、その特定のクラスをコーディングしました。一般的なコンセンサスは、ビットフィールドを新しいコードに含めるべきではないということです。

于 2013-08-02T02:46:21.377 に答える