вопрос битовой маски? - PullRequest
       3

вопрос битовой маски?

23 голосов
/ 28 декабря 2010

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

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

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

Ответы [ 6 ]

37 голосов
/ 28 декабря 2010

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 = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT;

Чтобы объяснить это, STORABLE = (1 << 3); означает, что STORABLE равен числу один (двоичный 1, попадающий только в битовую позицию 0), смещенному влево на 3 позиции.Обратите внимание, что STORABLE = Math.pow(2, 3); будет эквивалентно.Поскольку ни один из битов не перекрывается между флагами, мы можем объединить их все в одно целое, а затем разделить их позже.

Мы можем проверить наличие флагов с помощью побитового оператора AND, который вернетненулевое значение, если флаг установлен, и нулевое значение, если флаг не установлен:

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 
20 голосов
/ 28 декабря 2010

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

5 голосов
/ 28 декабря 2010

a << b сдвигает биты в значениях a b влево, дополняя новые биты справа нулями.1 << n соответствует целому числу только с установленным n-м битом (считая от 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 голосов
/ 28 декабря 2010

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

Пример:

100 | 10 = 110

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

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

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

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)
0 голосов
/ 28 декабря 2010

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

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

0 голосов
/ 28 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...