@shlExact

@shlExact

왼쪽 시프트 연산을 수행하는 내장 함수예요. 시프트로 빠져나가는 비트가 있으면 안 되는, 정확성이 보장되는 시프트라고 보시면 돼요.

출처: Zig Documentation

본문

@shlExact(value: T, shift_amt: Log2T) T

왼쪽 시프트 연산(<<)을 수행해요.

부호 없는 정수라면, 빠져나가는 위치에 있는 1 비트가 하나라도 있으면 결과가 undefined예요. 부호 있는 정수라면, 결과의 부호 비트와 다른 값을 가진 비트가 하나라도 시프트로 빠져나가면 결과가 undefined가 돼요.

shift_amt의 타입은 log2(@typeInfo(T).int.bits) 비트를 가진 부호 없는 정수예요. 그 이유는 shift_amt >= @typeInfo(T).int.bits인 경우 안전 검사로 걸러지는 Illegal Behavior가 발생하기 때문이에요.

comptime_int는 무한한 비트 수를 가진 정수처럼 취급돼요. 즉 이런 경우에는 @shlExact가 항상 결과를 만들어 내고 컴파일 에러를 낼 수 없어요.

참고:

더 알아보기

  • @shlExact는 비트가 하나도 손실되지 않아야 하는 시프트 연산이에요. 부호 없는 정수는 1 비트가 빠져나가면, 부호 있는 정수는 부호 비트와 어긋나는 비트가 빠져나가면 정의되지 않은 결과(undefined)가 돼요.
  • 시프트량(shift_amt) 타입은 log2(@typeInfo(T).int.bits) 비트의 부호 없는 정수로 고정돼요. 값을 벗어나면 안전 검사(safety check)에 걸려 Illegal Behavior로 처리돼요.
  • comptime_int는 무한 비트로 모델링돼서 언제나 결과가 나오고 컴파일 에러가 없어요.
  • 비트가 손실돼도 되는 시프트는 @shlWithOverflow를, 오른쪽 시프트는 @shrExact를 살펴보세요.