Shift 연산자

https://jeongchul.tistory.com/730

 

Snowflake ID란 C, C++, Java, Golang

Snowflake ID?Snowflake ID는 Twitter에서 개발한 분산 시스템을 위한 고유한 ID 생성 알고리즘입니다.이 방식은 빠르고 효율적으로 중복되지 않는 고유 ID를 대규모 시스템에서 생성할 수 있도록 설계되

jeongchul.tistory.com

위의 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. 1 << NODE_BITS 연산의 의미
    • 1 << 5는 1을 5비트 만큼 왼쪽으로 이동시킨다는 뜻입니다. 1의 이진수 표현은 00000001입니다.
    • 5비트 왼쪽으로 이동하면 00100000이 되어, 이는 10진수로 32입니다.
  2. 1의 의미
    • 1 << 5는 32이므로, 이 값에서 1을 빼면 31이 됩니다.
    • 따라서 MAX_NODE_ID는 31이 됩니다. 이 값은 5비트로 표현 가능한 최대 값을 의미합니다.
  3. 왜 31인가?
    • 5비트로 표현할 수 있는 값은 0부터 31까지입니다.
      • 5비트로 나타낼 수 있는 모든 가능한 값의 범위는 00000에서 11111까지, 즉 0부터 31(총 32개의 값)입니다.
    • MAX_NODE_ID = (1 << 5) - 1로 계산하면 31이 되며, 이는 노드 ID가 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. 1 << 5 → 1을 5비트 왼쪽으로 시프트 → 00100000 (32)
  2. 32 - 1 → 31 (최대값)

따라서 MAX_NODE_ID는 5비트로 표현 가능한 값의 최대값(31)을 나타냅니다.

'Interview > C' 카테고리의 다른 글

C언어 Pointer  (0) 2024.10.17
C언어 Bit & 연산자  (0) 2024.10.17
김 정출