@clz — 선두 0 비트 세기

@clz — 선두 0 비트 세기 (Count Leading Zeroes)

정수의 이진 표현에서 맨 앞(가장 큰 자리)에 연속으로 붙어 있는 0의 개수를 세는 내장 함수예요. 비트 조작을 다루다 보면 "이 숫자는 얼마나 큰 값인가"를 비트 단위로 측정할 때 유용하게 쓰여요.

출처: Zig Documentation

본문

다음과 같이 호출해요.

@clz(operand: anytype) anytype

@TypeOf(operand)정수 타입 또는 정수 벡터 타입이어야 해요.

operand로는 integervector를 넘길 수 있어요.

정수의 이진 표현에서 최상위 비트(Most Significant Bit) 쪽에서 연속되는 0의 개수를 세는 연산이에요. 즉 big-endian 기준으로 앞쪽에 붙는 0을 세는 "count leading zeroes"예요.

반환 타입부호 없는 정수 또는 부호 없는 정수 벡터인데요, 그 정수 타입의 "비트 수"를 표현할 수 있는 최소한의 비트 개수로 만들어져요. 예를 들어 8비트 정수면 0~8까지의 값을 담아야 하니 결과는 4비트 타입이 되죠.

한 가지 기억할 점이 있어요. operand0이면, @clz는 정수 타입 T비트 폭 전체를 돌려줘요. 예를 들어 8비트 타입에 0을 넣으면 8이 반환되는 거예요. 0에는 선두 0이 "비트 수만큼" 전부 붙어 있는 셈이니까요.

함께 보면 좋아요

  • @ctz — 반대 방향, 즉 최하위 비트 쪽에서 연속되는 0의 개수를 세는 함수예요.
  • @popCount — 0이 아니라 1로 설정된 비트의 개수를 세는 함수예요.

더 알아보기 (Learn more)

  • @clz는 정수의 "크기"를 비트 단위로 빠르게 파악할 때 써요. 예를 들어 최상위 1비트의 위치를 구하는 것과 밀접하게 연결돼요.
  • 0이라는 엣지 케이스에서 비트 폭을 그대로 돌려준다는 점은 직접 구현할 때 놓치기 쉬우니 꼭 확인하세요.
  • 반환 타입이 부호 없는 타입이라는 점, 그리고 벡터에도 그대로 적용된다는 점을 기억해 두면 좋아요.