@popCount — 정수에서 켜진 비트 세기

@popCount — 정수에서 켜진 비트 세기

어떤 값에 1로 설정된 비트가 몇 개인지 셀 때가 있어요. 비트 필드 하나를 보고 상태가 몇 개 켜져 있는지 확인한다거나, 해밍 거리(hamming distance)를 계산한다거나 할 때죠. 이때 정수 안에서 1인 비트의 개수를 세 주는 내장 함수가 바로 @popCount예요. 영어로 "population count"라 불러서, 정해진 범위 안에 "사는" 1 비트들을 센다는 뜻이랍니다.

출처: Zig Documentation

본문

@popCount는 이렇게 생겼어요.

@popCount(operand: anytype) anytype

먼저 입력부터 볼게요. @TypeOf(operand)는 정수 타입이어야 하고, operand 자리는 정수(integer)나 vector가 올 수 있어요.

그러면 이 함수는 정수 안에 1로 설정된 비트의 개수, 즉 population count를 세어서 돌려줘요.

반환 타입은 부호 없는 정수, 또는 부호 없는 정수의 벡터예요. 그런데 재미있는 점이 하나 있어요. 반환 타입이 입력 타입과 똑같은 게 아니라, 입력 타입의 비트 수를 표현할 수 있는 최소 비트 수로 잡혀요. 예를 들어 입력이 8비트 정수라면, 켜진 비트는 아무리 많아도 8개니까 이를 표현하는 데 4비트면 충분하죠. 그래서 그런 식으로 최소 비트 폭을 계산한 부호 없는 정수(혹은 그런 정수의 벡터)가 반환돼요.

더 알아보기

이 함수와 비슷하게 다른 비트 연산 내장 함수도 함께 보면 좋아요.

  • @ctz — 최하위 비트부터 센 연속된 0의 개수
  • @clz — 최상위 비트부터 센 연속된 0의 개수