<< 연산자(C# 참조)
왼쪽 시프트 연산자(<<)는 첫째 피연산자를 둘째 피연산자에서 지정한 비트 수만큼 비트 단위로 왼쪽으로 이동합니다. 두 번째 피연산자의 형식은 int 또는 int에 대한 미리 정의된 암시적 숫자 변환이 있는 형식이어야 합니다.
설명
첫째 피연산자가 32비트 용량의 int 또는 uint 형식이면 시프트 횟수는 둘째 피연산자의 하위 5비트로 지정됩니다. 즉, 실제 시프트 횟수는 0-31 비트입니다.
첫째 피연산자가 64비트 용량의 long 또는 ulong 형식이면 시프트 횟수는 둘째 피연산자의 하위 6비트로 지정됩니다. 즉, 실제 시프트 횟수는 0-63 비트입니다.
시프트 후 첫 번째 피연산자의 형식 범위 내에 없는 상위 비트는 무시되고 하위의 빈 비트는 0으로 채워집니다. 시프트 연산은 오버플로를 일으키지 않습니다.
사용자 정의 형식으로 << 연산자를 오버로드할 수 있습니다(operator 참조). 이 경우, 첫째 피연산자의 형식은 사용자 정의 형식이어야 하며 둘째 피연산자의 형식은 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 의 결과는 같습니다.