位掩码问题?

Pri*_*rix 23 java bitmask

我有以下内容:

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);
Run Code Online (Sandbox Code Playgroud)

我想了解如何计算得出以下结果,例如:12414

我真的很不知道如何使用位掩码工作,如果任何人可以给出一些提示并解释它是如何进行的,我会非常感激.

Ple*_*and 37

二进制 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
Run Code Online (Sandbox Code Playgroud)

查看哪些位是1.这些是在位掩码中设置的标志,它是通过使用按位OR运算符组合标志创建的:

bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT;
Run Code Online (Sandbox Code Playgroud)

为了进一步解释这一点,STORABLE = (1 << 3);意味着STORABLE等于向左移位3位的第一个(二进制1,仅在位位置0下降).请注意,STORABLE = Math.pow(2, 3);这是等效的.因为标志之间没有任何位重叠,所以我们可以将它们全部组合成一个int,然后将它们分开.

我们可以使用按位AND运算符来检查是否存在标志,如果设置了标志,它将返回非零值,如果未设置标志,则返回零值:

if(bitmask & TRADEABLE != 0) {
    // This item can be traded
} else {
    // This item cannot be traded
}
Run Code Online (Sandbox Code Playgroud)

我们可以设置,清除或切换这样的标志:

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 
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 20

表达式(1 << n)等于2提升到n的幂.

当你写(1 << n) | (1 << m)这个是相同的(1 << n) + (1 << m),只要nm不同.因此,如果您愿意,可以通过简单的添加来考虑它.

12414以二进制是11000001111110所以它是下列标志的总和(或按位OR):

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的二进制表示中设置的位.


mar*_*cog 5

a << ba b值的位移到左侧,用零填充右侧的新位.1 << n等于只有第nn位(从右边的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
Run Code Online (Sandbox Code Playgroud)