enum
{
kFlag_FPS = 1 << 0,
kFlag_Help = 1 << 1,
kFlag_RedBlue3D = 1 << 2,
}
このコードが何であるかを理解しようとしていますが、何がよくわかりません:
1 << 0
意味?
どんな助けでも大歓迎です!
enum
{
kFlag_FPS = 1 << 0,
kFlag_Help = 1 << 1,
kFlag_RedBlue3D = 1 << 2,
}
このコードが何であるかを理解しようとしていますが、何がよくわかりません:
1 << 0
意味?
どんな助けでも大歓迎です!
MSDNから- シフト演算子: >> および <<
左シフト演算子は、第 1 オペランドのビット パターンを、第 2 オペランドで指定されたビット数だけ左にシフトします。シフト操作によって空になったビットはゼロで埋められます。これは、シフトして回転する操作ではなく、論理シフトです。
これは、ユーザーが のビット値を取得1
し、右の数値に基づいてビットを左にシフトしていることを意味します。
つまり、この場合、それらの値はバイナリで次のようになります。
1 << 0 = `0000 0001`
1 << 1 = `0000 0010`
1 << 2 = `0000 0100`
最初のシフトは必要ありませんが、残りのシフトとの一貫性が増しています。
1 << 0
は 0 ポジションだけ左にシフトされた 1 です。これはちょうど 1 です。
x << y
- x のビットを左に (より大きな値に) y 回シフトすることを意味します。数学では、これは次のようになります:
x * (2^y)
またはx * pow(2, y)
演算子は<<
ビット シフターです。したがって1 << 2
、 は、4
取得してビット単位1
でシフトするのと同じです。2
を使用する場合1 << 0
、それは値に影響を与えず、おそらくすべてが一貫して見えるようにするために存在します
それは単純だったかもしれません
enum
{
kFlag_FPS = 1,
kFlag_Help = 1 << 1,
kFlag_RedBlue3D = 1 << 2,
}
しかし、コーダーはより対称性を好みます。
>> (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
これは、任意のパターン (と私は主張します) に従うために行われた冗長な操作です。
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 は明確にするためのものですが、それでも私たちは皆ここにいます。