PS알못 OrbitHv의 PS logo PS알못 OrbitHv의 PS

작성: 2021-01-19 22:46
수정: 2021-02-06 23:20
난이도: Bronze Ⅳ

※ 이 포스트는 까먹을 만한/더 알면 좋은 것만 정리합니다

C에서의 불 대수(true / false)

C에는 불 대수를 나타내는 타입이 존재하지 않는다. 대신 int를 이용하여 참/거짓을 저장한다. 하지만 int의 범위는 -2147483648~2147483647로 어느 값을 참으로, 어느 값은 거짓으로 인식해야 하는지가 궁금해진다. C는 보통 0을 거짓, 1을 참이라고 놓는다. 위의 논리 연산들이 C++, Java, Python에서는 true, false로 반환할 동안 C는 10으로 반환한다. 즉, 3 < 5의 반환값은 1인 것이다. 그러면 나머지 값은? C는 논리 연산의 반환값이 0과 1밖에 없지만 이외의 값에 대해서는 참과 거짓을 x != 0으로 판별한다. 즉, int의 값이 0만 아니면 이 변수를 참으로 인식, 0이면 거짓으로 인식한다. 이를 이용하면 숏코딩에 상당히 도움이 된다. 따라서 아래와 같은 조건문을 사용할 수 있다.

if (x) { } // if (x != 0) 과 같음
if (x - 7) { } // if (x != 7) 과 같음

논리 연산자와 비트 연산자

논리 연산은 하나의 비트를 가지고 진행하는 것인데, 이를 확장시켜 n바이트 단위의 정수형에도 적용한 연산자들이 있다. 이 연산자는 PS에 있어서 빠질 수 없는 연산자이며, 그 용도 또한 다양하다.

종류 논리 연산 비트 연산
AND && &
OR || |
NOT ! ~
XOR != ^

여기에 bit-shift라는 비트 연산자도 있다. bit-shift는 비트의 위치를 특정 방향으로 일정 거리만큼 옮겨버린다.

연산 의미
x << n x의 모든 비트를 왼쪽으로 n만큼 이동
x >> n x의 모든 비트를 오른쪽으로 n만큼 이동

C/C++에서 비트를 옮길 때, 범위를 넘어가는 값은 모두 버리고, 빈 칸은 0으로 채운다. Java의 경우는 조금 다른데, 오른쪽으로 bit-shift를 진행할 경우, 빈 칸을 bit-shift하기 이전의 부호 비트값으로 채운다. 원래의 값이 음수였으면 1로, 양수였으면 0으로 채우는 셈이다. 대신 Java에서는 C/C++의 오른쪽 bit-shift 또한 사용할 수 있는데, 그 때에는 >>> 연산자를 사용한다. 이 연산자는 빈 칸을 모두 0으로 채운다.

x << n은 $x\times 2^n \mod 2^{32}$의 값을, x >> n은 $\left\lfloor{\frac{x}{2^n}}\right\rfloor$의 값을 가진다. 단, 음수의 unsigned right bit-shift(C/C++의 >>, Java의 >>>)는 부호가 바뀌므로 성립하지 않을 것이다.

비트 연산자는 PS에 자주 사용되는 비트마스킹에 주로 사용된다.

?:문

if-else문을 줄여서 아래와 같은 방식으로 쓸 수 있다. 작동 방식은 약간 다르겠지만 결과값은 똑같다.

n = n > 0 ? n : -n;
n = n if n > 0 else -n

정리