我有关注:

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) 只要 nm 是不同的。因此,如果需要,您可以用简单的添加来考虑它。

号码 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 等同于一个整数只有 nTH位(从右侧计数为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位。

http://en.wikipedia.org/wiki/mask_(Computing)

我的猜测是您要拿一些数字,例如您的示例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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top