什么是1<< 0?

时间:2013-08-13 17:38:22

标签: c++ syntax bit-manipulation

 enum
    {
      kFlag_FPS         = 1 << 0,
      kFlag_Help        = 1 << 1,
      kFlag_RedBlue3D   = 1 << 2,
    }

我试图了解这段代码是什么,我不太清楚:

1 << 0

装置?

非常感谢任何帮助!

7 个答案:

答案 0 :(得分:30)

来自MSDN - Shift Operators: >> and <<

  

左移运算符导致第一个操作数中的位模式为   被第二个指定的位数向左移动   操作数。通过换档操作腾出的位是零填充的。这是   逻辑移位而不是移位和旋转操作。

这意味着用户正在获取1的位值,并根据正确的数字将位移到左侧。

这意味着在这种情况下,它们的值在二进制文件中看起来像这样。

1 << 0 = `0000 0001`
1 << 1 = `0000 0010`
1 << 2 = `0000 0100`

第一个班次没有必要,但看起来与其他班次更加一致。

答案 1 :(得分:6)

1 << 0向左移动了0个位置,只有1个位置。

答案 2 :(得分:4)

<<运算符有点移位。因此,当您1 << 2并移位4位时,1等于2。使用1 << 0时,这对价值没有影响,可能会使所有内容都显得一致

答案 3 :(得分:3)

x << y - 表示x向左移位(到较大值)y次。 在数学中,这看起来像: x * (2^y)x * pow(2, y)

答案 4 :(得分:2)

可能只是

enum
    {
      kFlag_FPS         = 1,
      kFlag_Help        = 1 << 1,
      kFlag_RedBlue3D   = 1 << 2,
    }

但编码员喜欢更加对称。

答案 5 :(得分:0)

>> (Signed right shift)如果数字为负,则将1用作填充符,如果数字为正,则将0用作填充符。

       int x = -4; 
       System.out.println(x>>1);  //output -2  
       int y = 4; 
       System.out.println(y>>1); //output 2

>>> (Unsigned right shift)在Java中,运算符“ >>>”是无符号右移运算符。无论数字的符号如何,它始终填充0。        // x使用32位2的补码形式存储。
       // -1的二进制表示全为1(111..1)

       int x = -1;   
       System.out.println(x>>>29);  // The value of 'x>>>29' is 00...0111 
       System.out.println(x>>>30);  // The value of 'x>>>30' is 00...0011  
       System.out.println(x>>>31);  // The value of 'x>>>31' is 00...0001

答案 6 :(得分:0)

这是一种随意遵循一种模式(我认为)的冗余操作。

tl;dr 它只是 1

1 作为 int 32 是:

00000000 000000000 00000000 00000001

1 << 1 将所有东西向左移动一次,产生 2

00000000 000000000 00000000 00000010

因此, 1 << 0 将所有内容向左移动零次,产生不变的 1

00000000 000000000 00000000 00000001

对于那些在枚举中使用它的人:

enum {
   firstOption = 0,
   secondOption = (1 << 0),
   thirdOption = (1 << 1),
   // etc.
}

为了避免引用此页面,如果您真的想维护一个模式(无论出于何种原因),最好这样做:

enum {
   firstOption = (0 << 0),
   secondOption = (1 << 0),
   thirdOption = (1 << 1),
   // etc.
}

但这对我来说似乎有点傻。我只是更喜欢:

enum {
   firstOption = 0,
   secondOption = 1, // was that so hard?
   thirdOption = (1 << 1),
   // etc.
}

具有讽刺意味的是 1 << 0 是为了澄清,但我们都在这里。