我的一位同事写了一篇声明,我并不完全理解。不幸的是他现在还没有,所以在这里(改名,我们正在Unity中开展游戏)。
private readonly int FRUIT_LAYERS =
(1 << LayerMask.NameToLayer("Apple"))
| (1 << LayerMask.NameToLayer("Banana"));
NameToLayer接受一个字符串并返回一个整数。我一直看到左移位运算符在右侧而不是左侧使用常数整数,我通过Google找到的所有示例都遵循这种方法。在这种情况下,我认为他正在将Apple和Banana推到同一个相对层(我稍后将用于过滤)。在未来会有更多的“成果”来过滤。任何精彩的stackoverflowers谁能给我解释这些线上发生的事情?
答案 0 :(得分:7)
1 << x
基本上是说“给我一个数字,其中第(x + 1)位是1,其余数字都是零。
x | y
是一个按位OR,因此它将遍历从1到n的每个位,如果该位在x
或y
中为1,则该位将为1结果,如果不是,它将为零。
因此,如果LayerMask.NameToLayer("Apple")
返回2
而LayerMask.NameToLayer("Banana")
返回3
,那么FRUIT_LAYERS
将是第3和第4位设置的数字,即{{} 1}}二进制,或12基数10.
答案 1 :(得分:3)
您的同事基本上使用int
代替bool[32]
来尝试节省空间。您显示的代码块类似于
bool[] FRUIT_LAYERS = new bool[32];
FRUIT_LAYERS[LayerMask.NameToLayer("Apple")] = true;
FRUIT_LAYERS[LayerMask.NameToLayer("Banana")] = true;
您可能想要考虑更像这样的模式:
[Flags]
enum FruitLayers : int
{
Apple = 1 << 0,
Banana = 1 << 1,
Kiwi = 1 << 2,
...
}
private readonly FruitLayers FRUIT_LAYERS = FruitLayers.Apple | FruitLayers.Banana;
答案 2 :(得分:2)
代码将二进制值1向左移动,要移位的二进制位数由Apple和Banana确定,在两个值移位后,以二进制方式进行OR运算
实施例: 假设苹果返回2并且香蕉返回3: 1&lt;&lt; 2是0100(表示十进制4) 1&lt;&lt; 3是1000(表示十进制的八个)
现在0100按位或1000是1100,这意味着12
答案 3 :(得分:2)
1&lt;&lt; n基本上等于2 n