https://www.acmicpc.net/problem/24389
24389번: 2의 보수
컴퓨터는 뺄셈을 처리할 때 내부적으로 2의 보수를 사용한다. 어떤 수의 2의 보수는 해당하는 숫자의 모든 비트를 반전시킨 뒤, 1을 더해 만들 수 있다. 이때, 32비트 기준으로 처음 표현했던 수와
www.acmicpc.net
난이도 : 브론즈 1
태그 : 수학, 비트마스킹
설명
컴퓨터가 음수를 표현하는 방식중 하나인 2의 보수법에 관한 문제입니다.
10진수가 입력되면 이를 2진수로 바꾸고, 1을 0으로, 0을 1로 반전시킨 후, 1을 더해 구할 수 있습니다.
소스코드
#include <stdio.h>
int main() {
int bit[32] = {0};
int bitReversed[32] = {0};
int n;
scanf("%d", &n);
int idx = 0;
// 10진수 -> 2진수 변환
while (n != 0) {
if (n % 2 == 1) bit[idx] = 1;
else bit[idx] = 0;
n /= 2;
idx++;
}
// 1 -> 0, 1 -> 0
for (int i = 0; i < 32; i++) {
if (bit[i] == 1) bitReversed[i] = 0;
else bitReversed[i] = 1;
}
// 1을 더해줌
bitReversed[0]++;
// 현재 수가 2이면 0으로 만들고 앞에 수에 1을 더함
for (int i = 0; i < 32; i++) {
if (bitReversed[i] == 2) {
bitReversed[i] = 0;
bitReversed[i + 1]++;
}
}
int diffCnt = 0;
// 원본 2진수와 2의 보수의 비트 중 서로 다른 비트 수를 구함
for (int i = 0; i < 32; i++) if (bit[i] != bitReversed[i]) diffCnt++;
printf("%d", diffCnt);
}
'코딩테스트 > C | C++' 카테고리의 다른 글
[백준 16486번] [C언어] 운동장 한 바퀴 (0) | 2023.01.16 |
---|---|
[백준 11971번] [C언어] 속도 위반 (0) | 2022.12.02 |
[백준 3595번] [C언어] 맥주 냉장고 (1) | 2022.12.02 |
[백준 2520번] [C언어] 팬케이크 사랑 (0) | 2022.11.29 |
[백준 3447번] [C언어] 버그왕 (0) | 2022.11.29 |