C++/C++ 강좌 문제 해답

[C++ 강좌 해답] 2-3. 연산자 II 정답 공개 및 해설

카루-R 2022. 2. 16. 15:04
반응형
 

[카루의 C++ 강좌] 2-3. 연산자 II, 연산자 우선순위

저번 시간에 배운 연산자는 복습하셨나요? 이제 더 난이도를 올려보겠습니다. 비트 연산자 우리는 10진법을 기본으로 사용하지만, 컴퓨터는 이진법이 기본인 거 아시죠? 0과 1을 사용하죠. _ _ _ _

karupro.tistory.com

2-3 강좌의 도전 과제 해답을 설명합니다.

1. 다음 코드에서 출력되는 값은 무엇입니까?

int n = 5;
std::cout << n++ << std::endl;

후위 증감 연산자는 그 줄 실행이 끝난 뒤에 값을 1 증가시키므로 출력값은 5 입니다.

2. 다음 코드는 경고가 발생합니다. 이를 해결하기 위한 연산자는 무엇입니까?

double d = 6.2458;
int su{d};

사실 그냥 아래와 같이 써도 동작하기는 합니다만, 제가 원하는 답은 이게 아닙니다

int su(d);
int su = d;

초기화는 반드시 중괄호를 사용하라고 말씀드렸죠? 아래가 제가 원한 정답이었습니다.

int su{static_cast<int>(d)};

static_cast<> 로 명시적 형 변환을 해 주어야 경고를 없앨 수 있습니다. 버그가 생길 확률도 줄겠죠.

3. 다음 코드는 오류가 발생합니다. 이유가 무엇인가요?

std::cout << true || false << std::endl;
error: invalid operands of types ‘bool’ and ‘’ to binary ‘operator<<’
     std::cout << true || false << std::endl;
                          ~~~~~~^~~~~~

답은 간단합니다. ||보다 <<의 우선순위가 더 높기 때문에 아래처럼 계산이 된 것입니다.

(std::cout << true) || (false << std::endl);

std::cout << true는 아무 문제 없지만 false << std::endl은 문제가 분명 있죠. 오류를 해결하려면 || 부분을 먼저 계산하게 하면 됩니다. 아래처럼 괄호를 씌워주세요.

std::cout << (true || false) << std::endl;

4. [고난이도] 비트 연산자를 사용하여 홀수와 짝수를 판별하시오.

int n;
std::cin >> n;

std::cout << (/* 이 부분에 알맞은 식은? */ ? "홀수" : "짝수");

비트를 잘 생각해보면, 마지막 비트는 1의 값을 가졌습니다. 그 외에 다른 비트는 모두 2, 4, 8, 16...으로 짝수의 값을 가지죠. 즉, 마지막 비트가 홀수/짝수를 결정합니다. 마지막 비트가 켜져있으면(=1이라면) 1의 값을 더 가지므로 홀수가 되고, 꺼져있으면(=0이라면) 짝수가 되죠.

n이 홀수라는 것은 n의 마지막 비트가 1이라는 뜻이고, 그 말은 n을 1과 & 연산을 하면 1이 나온다는 뜻이죠. 짝수라면 1이 안 나온다는 뜻이겠죠?

따라서 코드는 이렇습니다.

std::cout << ((n & 1) == 1 ? "홀수" : "짝수");

(n & 1) == 1이면 홀수입니다. 연산자 우선순위 때문에 괄호를 꼭 씌워줘야 합니다.

5. [고난이도] 비트 연산자를 사용하여 2의 제곱수를 판별하시오.

int n;
std::cin >> n;

std::cout << ( /* 이 부분에 알맞은 식은? */ ? "2의 제곱수입니다" : "2의 제곱수가 아닙니다");

2의 제곱수를 비트 연산자로 표현하면, 딱 한 개의 비트만 켜지게 됩니다.

2 = 0B0010, 4 = 0B0100, 8 = 0B1000, ....

자, 여기서 1씩 빼 볼까요?

1 = 0B0001, 3 = 0B0011, 7 = 0B0111, ...

세로끼리 AND 연산을 해 봅시다.

1 & 2 = 0, 3 & 4 = 0, 7 & 8 = 0

즉, 어떤 수가 2의 제곱수라면 그 수에서 1을 뺀 수와 AND 연산을 했을 때 0이 나와야 합니다.

int n;
std::cin >> n;

std::cout << ((n & n - 1) == 0 ? "2의 제곱수입니다" : "2의 제곱수가 아닙니다");
반응형