Published 2022. 7. 7. 16:41

이곳저곳에서 남의 코드 구경하다 발견한 잡기술들이다. C/C++가 아닌 다른 언어들에서도 응용할 수 있는 것들이 많이 있다.
이런 잡기술들이 가독성을 안 좋게 만드는 것도 있지만 더 좋을 때도 있다고 생각한다. 상황에 따라 잘 사용하면 될 것 같다.
잡기술들을 발견하면 하나씩 추가할 예정이다. (최종 수정 2022/07/07)

char을 if문으로 여러 개 걸어야 할 때

if (c == 'A' || c == 'B' || c == 'C' || c == 'D')

위와 같은 코드를 아래와 같이 줄일 수 있다

if (strchr("ABCD", c))

 

나눗셈 올림

std::ceil(x / n)

위의 함수는 리턴 값이 실수이다.

1. x / n + !!(x % n)
2. (x + n - 1) / n

위의 두 방법으로 정수형만 이용하여 나눗셈 올림을 할 수 있다.

 

음수 인덱스 배열

int tmp[n+n];
int *arr = tmp + n;

이렇게 하면 arr은 [-n, n-1] 범위를 사용할 수 있는 배열이 된다.

 

띄어쓰기 단위로 출력하다 마지막에 개행

for (int i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");


이런 방법으로도 할 수 있지만 한 줄로도 할 수 있다.

for (int i = 0; i < n; i++) printf("%d%c", a[i], " \n"[i == n-1]);


양수는 1, 음수는 -1, 0은 0 리턴하는 함수

int f(int x) {
	if (x > 0) return 1;
	if (x < 0) return -1;
	return 0;
}

이렇게도 할 수 있지만 한 줄로도 할 수 있다.

int f(int x) {
	return (x > 0) - (x < 0);
}


임시 변수 없이 swap

x ^= y ^= x ^= y;

이건 임시 변수를 이용하는 것보다 효율도 더 좋지 않고 가독성도 정말 안 좋다. 그냥 보고 넘어가자. std::swap을 쓰는 걸로.. (임베디드 같은 분야에서 메모리를 최대한 조금 쓰기 위해 이런 걸 사용하는 경우도 있다고 들었는데 잘은 모르겠다..)
참고로 한 줄로 쓰는 건 c와 c++17 이전 버전에선 UB다. 평가 순서가 정의되지 않았다. c++17에서 ^=와 같은 연산들의 평가 순서가 정의됐다.

비트 연산

if (x != -1)

이 수식을 ~ 연산을 이용할 수 있다.

if (~x)

~(-1)은 0이기 때문에 -1일 때만 저 조건문이 false가 된다.

 

if (x % 2)

x가 홀수인지 체크하는 조건문이다.

if (x & 1)

첫 번째 비트가 1일 때만 홀수이기 때문이 이렇게 처리할 수 있다.

if (~x & 1)

반대로 짝수는 이렇게 할 수 있다.

 

if (x >> k & 1)

k번째 비트가 1인지 확인

if (!(x & (x - 1)))

x가 2^n인지 확인

 

(l + r) / 2

l + r >> 1

연산자 우선순위 때문에 괄호 없이 이렇게 할 수 있다.

l + (r - l >> 1)

l + r 이 오버플로우가 생길 가능성이 있다면 이렇게 하면 된다.

복사했습니다!