본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1274 2진수를 10진수로...

by 까망 하르방 2021. 3. 17.
반응형

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=557&sca=50

Approach

 비트마스크 (Bitmask) 

 

비트마스크 (Bitmask)

비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현 내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리

zoosso.tistory.com

보수의 정의

 N자리 A진법 수 K가 있을 때 A의 보수는 :

    ▶ AN - K

     A-1의 보수를 구하고 1을 더한다.

 N자리 A진법 수 K가 있을 때 A-1의 보수는 :

     AN - 1 - K

    ex) 110111012의 1의 보수 = 001000102 

 

ex) 8(N)자리 2(A)진법 수 0000 0101(K)의 2(A)의 보수 구하기 (십진법으로는 5)

 

Horner's Method

2진수 1101을 자리수별 가중치를 주어 10진수로 나타내면 아래와 같다.

1101 = 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 1 이므로

     = (((0*2 + 1) * 2 + 1) * 2 + 0) * 2 + 1 = 1310

 

방법 1

- 첫 비트는 부호비트이면서 음수인 경우 가중치를 갖는다.

- 첫 비트를 제외하고 [Horner's Method]로 10진수를 구한다.

- 첫 비트가 1이면 결과에 -128을 더한다.


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    // freopen("input.txt", "r", stdin);
    int d = 0, i, a;
    for (i = 0; i < 8; ++i) {
        scanf("%1d", &a);
        d = d * 2 + a;
    }
    
    // printf("%d\n", d - (d > 127)*256);
    if (d > 127) d -= 256;
    printf("%d\n", d);
}

 

방법 2

※ 8비트 signed 정수를 char형 변수로도 처리가능

    -128 ~ 127 까지 표현하는 특징 이용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    // freopen("input.txt", "r", stdin);
    int d = 0, i, a;
    for (i = 0; i < 8; ++i) {
        scanf("%1d", &a);
        d = d * 2 + a;
    }
    
    printf("%d\n", (char)d);
}

 

반응형

댓글