题
我有关注:
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
我对位掩膜的工作方式确实毫无意义,如果有人可以提供一些技巧,并解释它如何到达该数字,我将非常感谢。
解决方案
表达方式 (1 << n)
相当于升高的2。
当你写时 (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 = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT;
为了进一步解释这一点, STORABLE = (1 << 3);
意味着存储量等于第一(二进制1,仅落在位置0)的第一位置3位置3个位置。注意 STORABLE = Math.pow(2, 3);
将是等效的。由于旗帜之间没有任何位重叠,因此我们可以将它们全部结合到一个int中,然后将它们分开。
我们可以使用位和运算符检查FLAG的存在,如果设置了标志,该标志将返回非零值,如果未设置标志,则将零值:零值:
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
等同于一个整数只有 n
TH位(从右侧计数为0)集,等效于2n.
12414 IS IS 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和1位的组合。有些数字只有1位。
我的猜测是您要拿一些数字,例如您的示例12414,并弄清楚其中包含哪些属性。
例如,由于12414是二进制中的11000001111110,因此无论是可交易的,因为它与掩模和蒙版相关,将在第二位为您提供1个。
在二进制中,12414 IS是11000001111110。二进制中的limit_one为1,而<<,这是Bitshift操作员将零移至左填充,右侧为零。因此,直到UNK16最终为1000000000000000。现在,二进制的交易为10。 (在大多数语言中使用管道操作员'|')。
例子:
100 | 10 = 110
因此,要达到12414,您需要在以下变量上进行一个或以下变量:UNK16,UNK15,可交易,可销售,可存储,可在WH中存储,可在Legion WH中存储,并且可损坏。这些变量中每个位置上不同位置上的组合都为您提供了二进制11000001111110,事实证明,十进制为12414。
这可能是解释它的最简单方法,如果您想了解更多信息,则应阅读位于位运算符以及数字的二进制表示形式。
要找出数字12414具有的标志中的哪个标志,您可以使用&(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)