Подтвердить что ты не робот

Битмакс вопрос?

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

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

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

4b9b3361

Ответ 1

Выражение (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 при чтении справа налево.

Ответ 2

12414 в binary:

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

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

Чтобы пояснить это, STORABLE = (1 << 3); означает, что STORABLE равен номеру 1 (двоичный 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 

Ответ 3

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

Ответ 4

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

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

http://en.wikipedia.org/wiki/Mask_(computing)

Ответ 5

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

Например, поскольку 12414 - это 11000001111110 в двоичном формате, то, к чему он прикреплен, является допустимым, поскольку ANDing это число с маской даст вам 1 во втором бите.

Ответ 6

В двоичном выражении 12414 равно 11000001111110. LIMIT_ONE в двоичном формате равен 1, а < < < < < <, которое является оператором битдвига, перемещает нуль в левое заполнение с нулем справа. Следовательно, в двоичном файле используется двоичный файл 10 и т.д. До unk16, который заканчивается на 1000000000000000. Теперь вы объединяете эти значения с помощью побитового ИЛИ, который в основном помещает по 1 в каждую позицию, где по крайней мере один из ее операндов имеет один в этой позиции (оператор трубы '|' используется на большинстве языков).

Пример:

100 | 10 = 110

Поэтому, чтобы добраться до 12414, вам нужно выполнить побитовое ИЛИ по следующим переменным: unk16, unk15, товарный, selleable, storeable, storeable в wh, хранящийся в легионе wh и прерываемый. Комбинация единиц в разных положениях в каждой из этих переменных дает вам двоичный код 11000001111110, который оказывается равным 12414 в десятичной форме.

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

Чтобы узнать, какой из флагов имеет номер 12414, вы можете использовать оператор and (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)