<< 演算子 (C# リファレンス)
左シフト演算子 (<<) では、2 番目のオペランドで指定されたビット数だけ最初のオペランドが左にシフトされます。 2 番目のオペランドの型は int であるか、int への暗黙の数値変換が定義されている型である必要があります。
解説
1 番目のオペランドが int または uint (32 ビット値) の場合、シフト数は 2 番目のオペランドの下位 5 ビットで指定されます。 つまり、実際のシフト数は 0 ~ 31 ビットです。
1 番目のオペランドが long または ulong (64 ビット値) の場合、シフト数は 2 番目のオペランドの下位 6 ビットで指定されます。 つまり、実際のシフト数は 0 ~ 63 ビットです。
シフトの結果、1 番目のオペランドの型の範囲内にない上位ビットは破棄され、空になる下位ビットには 0 が入ります。 シフト演算では、オーバーフローは発生しません。
<< 演算子はユーザー定義型でオーバーロードできます。詳細については、「operator」を参照してください。オーバーロードでは、最初のオペランドの型はユーザー定義型、2 番目のオペランドの型は int である必要があります。 二項演算子をオーバーロードすると、対応する代入演算子がある場合には、この演算子も暗黙でオーバーロードされます。
使用例
class MainClass11
{
static void Main()
{
int i = 1;
long lg = 1;
// Shift i one bit to the left. The result is 2.
Console.WriteLine("0x{0:x}", i << 1);
// In binary, 33 is 100001. Because the value of the five low-order
// bits is 1, the result of the shift is again 2.
Console.WriteLine("0x{0:x}", i << 33);
// Because the type of lg is long, the shift is the value of the six
// low-order bits. In this example, the shift is 33, and the value of
// lg is shifted 33 bits to the left.
// In binary: 10 0000 0000 0000 0000 0000 0000 0000 0000
// In hexadecimal: 2 0 0 0 0 0 0 0 0
Console.WriteLine("0x{0:x}", lg << 33);
}
}
/*
Output:
0x2
0x2
0x200000000
*/
コメント
1 と 33 では下位 5 ビットが同じであるため、i<<1 と i<<33 の結果は同じになります。