代码之家  ›  专栏  ›  技术社区  ›  Karl von Moor

(1U<<X)做什么?

c++
  •  19
  • Karl von Moor  · 技术社区  · 15 年前

    我发现了这段代码:

    enum 
    {
      IsDynamic = (1U << 0),  // ...
      IsSharable = (1U << 1), // ...
      IsStrong = (1U << 2)    // ...
    };
    

    什么是 (1U << X) 怎么办?

    5 回复  |  直到 8 年前
        1
  •  36
  •   Philippe Leybaert    15 年前

    它设置位掩码:

    1U << 0 = 1
    1U << 1 = 2
    1U << 2 = 4
    etc...
    

    发生的情况是1U(无符号值1)向左移动x位。

    您发布的代码相当于:

    enum 
    {
          IsDynamic = 1U,  // binary: 00000000000000000000000000000001
          IsSharable = 2U, // binary: 00000000000000000000000000000010
          IsStrong = 4U    // binary: 00000000000000000000000000000100
    }
    
        2
  •  5
  •   Hamish Grubijan    15 年前

    位移位。它们不是说a=1,b=2,c=4,而是移动位。 其思想是将多个标志打包成一个整数(或长标记)。

    这实际上是一个非常干净的方法。

        3
  •  2
  •   Huw Jones    8 年前

    <<是位移位运算符。它将接收左侧的位,并按右侧指定的量移动它们。例如:

    1 << 1    -> 0b0001 << 1     =>   0b0010  
    1 << 2    -> 0b0001 << 2     =>   0b0100
    

    等。

        4
  •  0
  •   Mark Ransom    15 年前

    1U 是一个无符号值,设置了单个位0,并清除了所有其他位。这个 << 操作员表示“向左移动”。 1U << 0 表示创建一个设置为0位的值; 1U << 1 意味着用第1位集合创建一个值;等等。

        5
  •  0
  •   Bill Bingham    15 年前

    那个片段

    enum 
    {
          IsDynamic = (1U << 0),  // ...
          IsSharable = (1U << 1), // ...
          IsStrong = (1U << 2)    // ...
    }
    

    声明一个枚举,其值为2的幂。可能用作包含多个标志的值的掩码。

    例如,一个表示动态和可分解的东西的值是

    unsigned value = IsDynamic | IsSharable; // could use + as well
    

    并测试该值是否可靠

    if (value & IsStrong) { ... }