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

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

1 << 0

方法?

任何帮助是极大的赞赏!

4

7 回答 7

62

来自MSDN - 移位运算符:>> 和 <<

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

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

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

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

第一个班次不是必需的,但它看起来与其他班次更一致。

于 2013-08-13T17:41:33.057 回答
18

1 << 0是 1 向左移动了 0 个位置,也就是 1。

于 2013-08-13T17:40:11.477 回答
8

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

于 2013-08-13T18:17:57.163 回答
5

<<运算符是一个移位器。所以1 << 2, 等于4你取1并按2位移动。使用时1 << 0,这对价值没有影响,并且可能使一切看起来一致

于 2013-08-13T17:41:34.220 回答
4

本来可以很简单

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

但是编码器喜欢更多的对称性。

于 2013-08-13T17:39:59.473 回答
1

>> (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
于 2019-08-02T19:37:27.593 回答
0

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

tl;博士它只是 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 是为了澄清,但我们都在这里。

于 2021-04-07T17:58:58.690 回答