Вопрос

У меня есть следующее:

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

Я действительно не знаю, как работает Bitmask, и если кто -то может дать несколько советов и объяснить, как это идет на этот номер, я бы очень признателен.

Это было полезно?

Решение

Выражение (1 << n) эквивалентен 2 поднятую к силе n.

Когда вы пишете (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 в бинарный является:

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, которая создается с помощью бить или оператора для объединения флагов:

bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT;

Чтобы дополнительно объяснить это, STORABLE = (1 << 3); Означает, что хранение равна номеру один (двоичный 1, падающий только в бит -положении 0) смещено влево на 3 места. Обратите внимание, что 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 приравнивается к целому числу nTH BIT (считается из 0 справа), что эквивалентно 2не.

12414 - 11000001111110 в бинарном. Поэтому он производится путем суммирования констант, перечисленных ниже. Вы можете решить это, увидев, что бит 1 справа установлен, поэтому TRADEABLE это "set"; Бит 7 не установлен (это 0), следовательно, SOUL_BOUND не "set". Обратите внимание, как номера битов связываются с объявленными значениями (1 << n).

TRADEABLE
SELLABLE
STORABLE
STORABLE_IN_WH
STORABLE_IN_LEGION_WH
BREAKABLE
BLACK_CLOUD_TRADERS
CAN_SPLIT

Я не понимаю вопрос «как он рассчитывается, чтобы дать следующий результат». (Что рассчитано?)

Главное, что нужно понять, это то, что все компьютерные значения хранятся в двоичном языке. Любой номер будет комбинацией 0 и 1 бит. Некоторые числа имеют только один 1 бит.

http://en.wikipedia.org/wiki/mask_(mocmputing)

Я предполагаю, что вы принимаете некоторое число, например, ваш пример 12414, и выясните, какие свойства содержатся в нем.

Например, поскольку 12414 составляет 110000011111110 в двоичном изображении, что бы он ни прилагается, является торговым, потому что и это число с маской даст вам 1 во втором бите.

В двоичном изображении 12414 - 11000001111110. Limit_one в двоичном языке 1, а <<, который является оператором BitShift перемещает ноль в левую прокладку с нолью справа. Таким образом, торговля в двоичном файле составляет 10, и так далее до UNK16, который в конечном итоге станет 1000000000000000. Теперь вы собираете эти значения вместе, используя биче (Оператор трубы '|' используется на большинстве языков).

Пример:

100 | 10 = 110

Следовательно, чтобы добраться до 12414, вам нужно сделать кусочек или по следующим переменным: UNK16, UNK15, торговый, продаваемый, горный, горный в WH, горный в Legion WH и ломается. Комбинация одних в разных положениях в каждой из этих переменных дает вам бинарный 11000001111110, который оказывается 12414 в десятичном виде.

Это, наверное, самый простой способ объяснить это, если вы хотите узнать больше, вам следует прочитать об операторах бить и о том, как работает бинарное представление чисел.

Чтобы выяснить, какой из флагов есть номер 12414, вы можете использовать оператор & (Bitwise и)) и сделать нулевой чек. Например:

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top