5.7.3 시프트 연산자
이번에 소개할 연산자는 부호 없는 수에 대한 숫자 표현과 비트 집합 표현을 서로 연결해 준다. 왼쪽 시프트(left-shift) 연산인 <<는 2의 거듭제곱과 같다. 예를 들어 A = 240(비트 집합 {4, 5, 6, 7})에 대해 A << 2는 240 ‧ 22 = 240 ‧ 4 = 960이며 비트 집합으로 표현하면 {6, 7, 8, 9}이다. 해당 타입의 바이너리 표현 범위를 벗어나는 비트는 버린다. 가령 A << 9를 비트 집합으로 표현하면 {13, 14, 15, 16}이고, 값으로 표현하면 122880이어야 하지만, 16번째 비트가 없으므로 비트 집합은 {13, 14, 15}가 되고 값은 57344가 된다.
따라서 시프트 연산에서도 정밀도 p의 역할이 중요하다. 정밀도에 따라 잘려 나가는 비트의 범위가 달라질 뿐만 아니라, 우측의 피연산자에 나올 수 있는 값의 범위도 달라진다.
TAKEAWAY 5.53 시프트 연산의 두 번째 피연산자는 반드시 정밀도보다 작아야 한다.
바이너리 표현을 최하위 비트 쪽으로 이동시키는 오른쪽 시프트(right-shift) 연산 >>도 마찬가지다. 이 연산도 비트 표현과 숫자 표현을 연결하며 2의 거듭제곱만큼 나누는 것과 같다. 자릿수가 시프트할 값보다 작거나 같은 비트는 버린다. 주목할 점은 이 연산에서 정밀도는 중요하지 않다는 것이다. Exs 11
Exs 11 x>>n 연산에서 사라지는 비트는 x % (1ULL << n)의 나머지임을 증명해 보자.