【Unity/C#】C#中<<位移运算符的意义,及脚本中常见的使用场景

快速入门

在C#中,<<是一个位移运算符,表示左移位操作。

  • 例如,1 << 5的意思是将整数1向左移动5位。

在二进制下,整数1表示为0000 0001(假设我们是在8位的环境下)。当我们将它向左移动5位时,结果变为0010 0000,这在十进制中等于32。所以,1 << 5的结果是32。


常见使用场景

在Unity中,<<左移运算符常常用于以下几种场景:

层级掩码(Layer Masks)

层级掩码(Layer Mask)是一种用于控制游戏对象间的交互方式的机制。层级可以用来定义对象的种类,而层级掩码则可以用来选择性地考虑某些层级的对象,忽略其他层级的对象。

  • 例如,有一个游戏中的角色,它可以与环境中的许多物体交互,如地形、敌人、宝箱等。我们可能会将这些对象分别放在不同的层级上,然后使用层级掩码来控制角色的互动行为。角色的一种射线只与"地形"层级的对象交互,另一种射线只与"敌人"层级的对象交互。这就是层级掩码发挥作用的地方。
  • 例如,如果想要创建一个只与特定层(假设是第5层)交互的射线,可以使用位移运算符来创建一个层级掩码:

    int layerMask = 1 << 5;
    RaycastHit hit;
    if (Physics.Raycast(transform.position, transform.forward, out hit, 100, layerMask))
    {
          
          
        // 如果射线投射命中第5层中的对象,在这里执行一些操作。
    }
    

    这里1 << 5创建的是一个只有第5位是1(所有其他位都是0)的整数,它可以用作层级掩码。


枚举位标志(Enum Bit Flags)

枚举位标志(Enum Bit Flags)可以将一串位(bit)用于存储多个布尔值,这对于存储和处理一组相关的布尔状态非常有用。

  • 位移运算符也常常用于处理枚举位标志。例如,下面是一个表示对象状态的枚举:

    [Flags]
    public enum ObjectState
    {
          
          
        None = 0,
        Visible = 1 << 0,
        Active = 1 << 1,
        Selected = 1 << 2,
        // 依此类推
    }
    

    这是用来存储和处理多个状态的高效方式。

  • 如上所示的枚举中,可以这样创建一个同时具有VisibleActive状态的对象:

    ObjectState state = ObjectState.Visible | ObjectState.Active;
    

    TIPS:这里的|操作符是按位或操作,它将两个状态合并在一起。

  • 也可以使用&操作符(按位与操作)来检查一个对象是否具有特定的状态:

    bool isActive = (state & ObjectState.Active) != 0;
    
  • 还可以使用|=操作符来添加一个状态,使用&=~操作符来移除一个状态:

    // 添加Selected的状态.
    state |= ObjectState.Selected;
    
    // 移除Active的状态.
    state &= ~ObjectState.Active;
    

性能优化

  • 在某些情况下,使用位移运算符可以提高性能,尤其是在需要频繁进行乘除运算的场景中。因为,位操作通常比乘法和除法更快。例如,n << 1的结果是n乘以2,n >> 1的结果是n除以2。

TIPS:使用位操作需要谨慎,因为它可能使代码更难理解和调试。除非有明确的优势,否则其实原则还是坚持使用更直观的方法。

猜你喜欢

转载自blog.csdn.net/qq_16558821/article/details/131916440