C#左移运算符

时间:2013-04-05 17:08:20

标签: c# filtering bit-shift

我的一位同事写了一篇声明,我并不完全理解。不幸的是他现在还没有,所以在这里(改名,我们正在Unity中开展游戏)。

private readonly int FRUIT_LAYERS =
          (1 << LayerMask.NameToLayer("Apple"))
        | (1 << LayerMask.NameToLayer("Banana"));

NameToLayer接受一个字符串并返回一个整数。我一直看到左移位运算符在右侧而不是左侧使用常数整数,我通过Google找到的所有示例都遵循这种方法。在这种情况下,我认为他正在将Apple和Banana推到同一个相对层(我稍后将用于过滤)。在未来会有更多的“成果”来过滤。任何精彩的stackoverflowers谁能给我解释这些线上发生的事情?

4 个答案:

答案 0 :(得分:7)

1 << x基本上是说“给我一个数字,其中第(x + 1)位是1,其余数字都是零。

x | y是一个按位OR,因此它将遍历从1到n的每个位,如果该位在xy中为1,则该位将为1结果,如果不是,它将为零。

因此,如果LayerMask.NameToLayer("Apple")返回2LayerMask.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