Shift 연산자
https://jeongchul.tistory.com/730
위의 Snow Flake에서 Data center와 Node 그리고 Sequence의 최대 값을 지정하는 코드가 있습니다.
- MAX_DATA_CENTER_ID: 31
- MAX_NODE_ID: 31
- MAX_SEQ: 4095
#define DATA_CENTER_BITS 5
#define NODE_BITS 5
#define SEQ_BITS 12
#define MAX_DATA_CENTER_ID ((1 << DATA_CENTER_BITS) - 1) // <---
#define MAX_NODE_ID ((1 << NODE_BITS) - 1) // <---
#define MAX_SEQ ((1 << SEQ_BITS) - 1) // <---
C 언어에서 << 연산자는 왼쪽 시프트(Left Shift) 연산자로, 비트를 왼쪽으로 이동시키는 역할을 합니다. MAX_NODE_ID에서 사용된 << 연산은 비트 단위의 시프트 연산을 통해 특정 값의 범위를 계산하는데 사용됩니다. 이를 Snowflake에서 사용된 예시로 자세히 설명하겠습니다.
MAX_NODE 의 정의
#define MAX_NODE_ID ((1 << NODE_BITS) - 1)
이 부분에서 NODE_BITS는 5로 설정되었고, 이는 노드 ID를 나타내기 위해 5비트를 사용하겠다는 의미입니다. MAX_NODE_ID는 노드 ID가 표현할 수 있는 값의 최댓값을 나타냅니다.
- 1 << NODE_BITS 연산의 의미
- 1 << 5는 1을 5비트 만큼 왼쪽으로 이동시킨다는 뜻입니다. 1의 이진수 표현은 00000001입니다.
- 5비트 왼쪽으로 이동하면 00100000이 되어, 이는 10진수로 32입니다.
- 1의 의미
- 1 << 5는 32이므로, 이 값에서 1을 빼면 31이 됩니다.
- 따라서 MAX_NODE_ID는 31이 됩니다. 이 값은 5비트로 표현 가능한 최대 값을 의미합니다.
- 왜 31인가?
- 5비트로 표현할 수 있는 값은 0부터 31까지입니다.
- 5비트로 나타낼 수 있는 모든 가능한 값의 범위는 00000에서 11111까지, 즉 0부터 31(총 32개의 값)입니다.
- MAX_NODE_ID = (1 << 5) - 1로 계산하면 31이 되며, 이는 노드 ID가 0부터 31까지 가질 수 있음을 나타냅니다.
- 5비트로 표현할 수 있는 값은 0부터 31까지입니다.
<< 연산자 예시
<< 연산은 비트를 이동시키면서 값을 2의 제곱으로 곱하는 효과가 있습니다.
예를 들어:
- 1 << 0는 1 그대로.
- 1 << 1은 2진수에서 00000001을 왼쪽으로 한 칸 이동해 00000010이 되며, 이는 10진수로 2.
- 1 << 2는 00000100으로, 10진수로 4.
- 1 << 3은 00001000으로, 10진수로 8.
즉, 1 << n은 2^n과 같습니다.
전체 과정 예시
MAX_NODE_ID가 계산되는 과정을 요약하면:
- 1 << 5 → 1을 5비트 왼쪽으로 시프트 → 00100000 (32)
- 32 - 1 → 31 (최대값)
따라서 MAX_NODE_ID는 5비트로 표현 가능한 값의 최대값(31)을 나타냅니다.
'Interview > C' 카테고리의 다른 글
C언어 Pointer (0) | 2024.10.17 |
---|---|
C언어 Bit & 연산자 (0) | 2024.10.17 |