質問
私はフォローを持っています:
public static final int LIMIT_ONE = 1;
public static final int TRADEABLE = (1 << 1);
public static final int SELLABLE = (1 << 2);
public static final int STORABLE = (1 << 3);
public static final int STORABLE_IN_WH = (1 << 4);
public static final int STORABLE_IN_LEGION_WH = (1 << 5);
public static final int BREAKABLE = (1 << 6);
public static final int SOUL_BOUND = (1 << 7);
public static final int UNK9 = (1 << 8);
public static final int UNK10 = (1 << 9);
public static final int UNK11 = (1 << 10);
public static final int CAN_COMPOSITE_WEAPON = (1 << 11);
public static final int BLACK_CLOUD_TRADERS = (1 << 12);
public static final int CAN_SPLIT = (1 << 13);
public static final int UNK15 = (1 << 14);
public static final int UNK16 = (1 << 15);
そして、私は次のような次の結果を与えるためにそれがどのように計算されるかを理解したかったのです。 12414
私はビットマスクがどのように機能するかについて、そして誰かがいくつかのヒントを与えて、それがその数にどのように進むかを説明することができるなら、私は非常に感謝することについて本当に無知です。
解決
表現 (1 << n)
nのパワーに上げられた2に相当します。
あなたが書くとき (1 << n) | (1 << m)
これは同じです (1 << n) + (1 << m)
に限って n
と m
異なっています。必要に応じて、簡単な追加の観点から考えることができます。
番号 12414
バイナリでは 11000001111110
したがって、それは次のフラグの合計(またはビットワイズまたは)です。
TRADEABLE 1 << 1 = 2 SELLABLE 1 << 2 = 4 STORABLE 1 << 3 = 8 STORABLE_IN_WH 1 << 4 = 16 STORABLE_IN_LEGION_WH 1 << 5 = 32 BREAKABLE 1 << 6 = 64 BLACK_CLOUD_TRADERS 1 << 12 = 4096 CAN_SPLIT 1 << 13 = 8192 ======================================== Total = 12414
含まれるフラグは、右から左に読み取られたときに12414のバイナリ表現に設定されたビットに対応していることに注意してください。
他のヒント
12414 in バイナリ は:
Binary number: 1 1 0 0 0 0 0 1 1 1 1 1 1 0
-------------------------------------------------------
Bit positions: 13 12 11 10 9 8 7 6 5 4 3 2 1 0
どのビットが1であるかを見てください。これらはビットマスクに設定されたフラグです。これは、ビットワイズまたは演算子を使用してフラグを組み合わせて作成することによって作成されます。
bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT;
これをさらに説明するために、 STORABLE = (1 << 3);
保存可能は、ナンバーワン(バイナリ1、ビット位置0でのみ落ちる)に等しいことを意味します。ご了承ください STORABLE = Math.pow(2, 3);
同等です。フラグの間でビットが重複していないため、それらすべてを単一のINTに組み合わせてから、後で分割することができます。
ビットワイズと演算子を使用してフラグの存在を確認できます。これにより、フラグが設定されている場合はゼロ以外の値と、フラグが設定されていない場合はゼロ値が返されます。
if(bitmask & TRADEABLE != 0) {
// This item can be traded
} else {
// This item cannot be traded
}
このようなフラグを設定、クリア、または切り替えることができます。
bitmask |= TRADEABLE; // Sets the flag using bitwise OR
bitmask &= ~TRADEABLE; // Clears the flag using bitwise AND and NOT
bitmask ^= TRADEABLE; // Toggles the flag using bitwise XOR
a << b
ビットをシフトします a
b
左に値、右側の新しいビットをゼロでパディングします。 1 << n
のみの整数に相当します n
thビット(右から0からカウント)セット、これは2に相当しますn.
12414はバイナリの11000001111110です。したがって、以下にリストされている定数を合計することにより生成されます。右からビット1が設定されているのを見ることでこれを解決できます。 TRADEABLE
「セット」です。ビット7は設定されていません(0です)。 SOUL_BOUND
「設定」ではありません。ビット番号が宣言された値にどのように関連するかに注意してください (1 << n)
.
TRADEABLE
SELLABLE
STORABLE
STORABLE_IN_WH
STORABLE_IN_LEGION_WH
BREAKABLE
BLACK_CLOUD_TRADERS
CAN_SPLIT
「次の結果を与えるためにどのように計算されるか」という質問がわかりません。 (計算されたものは何ですか?)
理解すべき主なことは、すべてのコンピューター値がバイナリに保存されていることです。任意の数値は、0と1ビットの組み合わせになります。一部の数字には1ビットしかありません。
私の推測では、例12414のようないくつかの数を取得し、その中にどのプロパティが含まれているかを把握することです。
たとえば、12414はバイナリでは11000001111110であるため、添付されているものは何でも取引可能です。これは、マスクを使用してこの数字を2番目に1ビットで提供するためです。
バイナリでは、12414は11000001111110です。バイナリのlimit_oneは1、<<はビットシフト演算子である<<です。したがって、バイナリで取引可能なのは、UNK16まで1000000000000000になるまで10個などです。ビットワイズを使用してこれらの値をまとめるか、基本的にその位置の少なくとも1つがその位置に1つの位置に1を配置します。 (パイプ演算子 '|'はほとんどの言語で使用されます)。
例:
100 | 10 = 110
したがって、12414に到達するには、UNK16、UNK15、取引可能、販売可能、保存可能、貯蔵可能、レギオンWHで貯蔵可能で、壊れやすい、または壊れやすい、unk16、unk15、販売可能、貯蔵可能、貯蔵可能な変数を少し回避する必要があります。これらの各変数の異なる位置にあるものの組み合わせにより、バイナリ1100000111110が得られます。
これはおそらくそれを説明する最も簡単な方法です。もっと知りたい場合は、ビットワイズ演算子と、数字のバイナリ表現がどのように機能するかを読む必要があります。
12414の数字のどれがあるかを確認するには、&(bitwise and)演算子を使用してゼロチェックを行うことができます。例えば:
6 & 2 = 2 (110 has a 1 on the same position as 2, which is 010)
6 & 1 = 0 (110 does not have a 1 on the same position as 1, which is 001)