我有以下内容:
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),只要n和m不同.因此,如果您愿意,可以通过简单的添加来考虑它.
数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的二进制表示中设置的位.
a << b将a 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)