1

これは私がしばらく見ているコードです。コードがどのように機能するのだろうか。

public static final int MULTI = 1 << 1;
public static final int SINGLE = 1 << 2;
public static final int READ_ONLY = 1 << 3;
SWT.MULTI | SWT.SINGLE | SWT.READ_ONLY

私はTableViewer(Composite parent, int style)答えを探してのクラス実装に深く入りましたが、あまり見つかりませんでした。

このコードを見つけましたが、あまり理解していませんでした

static int checkBits (int style, int int0, int int1, int int2, int int3, int int4, int int5) {
int mask = int0 | int1 | int2 | int3 | int4 | int5;
if ((style & mask) == 0) style |= int0;
if ((style & int0) != 0) style = (style & ~mask) | int0;
if ((style & int1) != 0) style = (style & ~mask) | int1;
if ((style & int2) != 0) style = (style & ~mask) | int2;
if ((style & int3) != 0) style = (style & ~mask) | int3;
if ((style & int4) != 0) style = (style & ~mask) | int4;
if ((style & int5) != 0) style = (style & ~mask) | int5;
return style;
}
4

1 に答える 1

6

ビットを一緒にパッキング

このコードを見てみましょう。

public static final int MULTI = 1 << 1;
public static final int SINGLE = 1 << 2;
public static final int READ_ONLY = 1 << 3;

「<<」演算子は、ビットを左にシフトすることを意味します。「<<」演算子の後の数字は、シフトするビット数を示します。

したがって、コードを記述する別の方法は次のようになります。

public static final int MULTI = 2;
public static final int SINGLE = 4;
public static final int READ_ONLY = 8;

このようにフラグを定義することにより、値をORで結合(「加算」)して、1バイトまたは1つの整数で保存できます。

SWT.MULTI | SWT.SINGLE

これは、2つの値のビットをORすることを意味します。しかし、それはどういう意味ですか?

この場合、値を1ビットとして定義しているため、値を加算するのと同じです。

MULTI = 2
SINGLE = 4

したがって、ステータス値は6(2 + 4)です。

覚えておいてください、私たちは追加していません。ビットを使用しているため、追加する場合と同じ効果が得られます。

ビットの開梱

投稿したコードの2番目のビットは、基本的に、私たちが思いついた6を取り、それを2と4に分割します。これは、各ビットを一度に1つずつチェックし、存在するかどうかを確認することで機能します。

一行取って、それが何をしているのか見てみましょう。

if ((style & int1) != 0) style = (style & ~mask) | int1;

int1スタイルビットの1つを表します。この説明のために、値が2のMULTIであるとしましょう。

最初の部分(if条件)は、ビットがスタイル整数に設定されているかどうかをテストします。

2番目の部分は少しトリッキーです。(ビット、それを取得します。非常に面白いです。)

maskの値はコードで指定されています。

int mask = int0 | int1 | int2 | int3 | int4 | int5;

これは、すべてのステータス値または一緒にされたものです。MULTI、SINGLE、およびREAD_ONLYの元の例から、x'0E'または14のマスクが得られます。この説明の残りの部分では、16進数を使用します。

ステータスビットが存在します

さて、私たちが話している行に戻ります。

if ((style & int1) != 0) style = (style & ~mask) | int1;

style & int1AND演算です。つまり、ビットはとの両方に設定する必要がstyleありint1ます。 Style以前に設定したときからx'06'(2 + 4)です。 int1x'02'です。x'06'とx'02'をANDすると、x'02'が得られ、ifの値になりますtrue

~maskx'0E'をx'F1'に変換します。つまり、すべてのビットが0から1および1から0に反転します。

style & ~maskAND演算です。x'06'とx'F1'をANDすると、x'00'になります。つまり、どのビットも一致しません。

int1はMULTIであり、値は2またはx'02'であると前述しました。ここで、前に説明したOR操作を実行します。x'00'とx'02'をORすると、x'02'が得られます。これは、抽出したいMULTI値です。

ステータスビットが存在しません

もう1つの方法(ステータスビットが存在しない場合)では、結果がわずかに異なります。READ_ONLYを設定しなかったので、その計算を見てみましょう。

READ_ONLYはx'08'です。スタイルはx'06'です。ifでこれらの値をANDすると

if ((style & int1) != 0) style = (style & ~mask) | int1;

x'00'を取得します。これにより、ifの値はになりますfalse

正当化

複数のステータス値を1バイトまたはワードに入れる本来の理由は、メモリを節約するためでした。これは、コンピュータのメモリが限られていた40年前に重要でした。これで、ステータスを渡すのに便利です。あるメソッドから別のメソッドに7つまたは15の異なるステータスインジケータを渡すのではなく、1つのステータスインジケータを渡します。

ご覧のとおり、トレードオフは、ステータスビットを抽出して使用できるようにするために少しのコードが必要になることです。

于 2013-01-31T10:00:45.400 に答える