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

このコードが何であるかを理解しようとしていますが、何がよくわかりません:

1 << 0

意味?

どんな助けでも大歓迎です!

4

7 に答える 7

62

MSDNから- シフト演算子: >> および <<

左シフト演算子は、第 1 オペランドのビット パターンを、第 2 オペランドで指定されたビット数だけ左にシフトします。シフト操作によって空になったビットはゼロで埋められます。これは、シフトして回転する操作ではなく、論理シフトです。

これは、ユーザーが のビット値を取得1し、右の数値に基づいてビットを左にシフトしていることを意味します。

つまり、この場合、それらの値はバイナリで次のようになります。

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

最初のシフトは必要ありませんが、残りのシフトとの一貫性が増しています。

于 2013-08-13T17:41:33.057 に答える
18

1 << 0は 0 ポジションだけ左にシフトされた 1 です。これはちょうど 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;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 は明確にするためのものですが、それでも私たちは皆ここにいます。

于 2021-04-07T17:58:58.690 に答える