Uknow's Lab.
article thumbnail

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);
}

 

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.