タグビット
1532 ワード
Javaでは、ステータス、プロパティ、または他の情報を整数で表すことがよくあります.よく見られるのは、1、2、4、8、16などのステータスをマークするビットです.彼らはそれぞれ異なるビットにいます.現在の状態を知る必要がある場合は、ビットゼロかどうかを判断するために「&」を使用するだけです.
種類が多すぎるため、すべてのマーク状態に連続整数を採用する場合があります.RelativeLayoutのプロパティの場合、連続整数を使用します.addRuleメソッドを呼び出すと、'|'を使用して複数のプロパティ設定を行うことはできません.
Phaserクラスでは、現在の状態と数を表すために長い整形が使用されます.次のようになります.
ここで、0〜15ビットはunarrived、16〜31ビットはparties、32〜62ビットはphase、最後のビットはterminatedを表す.このクラスは、これらの状態の取得について以下のように示す.
ここで、PARTIES_SHIFT = 16,UNARRIVED_MASK = 0xffff,PHASE_SHIFT = 32.longをintに変換すると、その後の32ビットが除去され、開始32ビット、すなわちunarrivedとpartiesのタグビットが保持されます.partiesを取得するにはcountsを16ビット右に移動するだけです.もちろん&で実現することもできます.次のようになります.
phaseの取得も上記のような方法で実現される.これは巧みな方法だ.long回転intの特徴を十分に利用し、空間の占有を減らし、同時にビット演算速度が速いため、プログラムをより速く実行することができる.
種類が多すぎるため、すべてのマーク状態に連続整数を採用する場合があります.RelativeLayoutのプロパティの場合、連続整数を使用します.addRuleメソッドを呼び出すと、'|'を使用して複数のプロパティ設定を行うことはできません.
Phaserクラスでは、現在の状態と数を表すために長い整形が使用されます.次のようになります.
private volatile long state;
ここで、0〜15ビットはunarrived、16〜31ビットはparties、32〜62ビットはphase、最後のビットはterminatedを表す.このクラスは、これらの状態の取得について以下のように示す.
long s = (parent == null) ? state : reconcileState();
int counts = (int)s;
int parties = counts >>> PARTIES_SHIFT;
int unarrived = counts & UNARRIVED_MASK;
......
phase = (int)(s >>> PHASE_SHIFT);
ここで、PARTIES_SHIFT = 16,UNARRIVED_MASK = 0xffff,PHASE_SHIFT = 32.longをintに変換すると、その後の32ビットが除去され、開始32ビット、すなわちunarrivedとpartiesのタグビットが保持されます.partiesを取得するにはcountsを16ビット右に移動するだけです.もちろん&で実現することもできます.次のようになります.
int parties = counts & 0xffff0000;
phaseの取得も上記のような方法で実現される.これは巧みな方法だ.long回転intの特徴を十分に利用し、空間の占有を減らし、同時にビット演算速度が速いため、プログラムをより速く実行することができる.