본문 바로가기
Algorithm

[Algorithm] 진수 변환

by Jamie Lim 2020. 11. 18.
#include "stdio.h"
#include "math.h"

void binary(int n, int bin[]) {  // 2진수로 변환 (음수는 2의 보수 적용)
	int b[32] = { 0, };  // 2진수 배열
	int o[32] = { 0, };  // 1의 보수 배열
	int t[32] = { 0, };  // 2의 보수 배열
	int i = 31;
	int ab = abs(n);     // 입력한 값의 절대값을 저장한 변수

	while (1) {          // 2진수 구하기 (마지막 자리부터 저장)
		b[i] = ab % 2;   // 현재 값을 2로 나눈 나머지 값을 2진수 배열에 저장
		ab = ab / 2;     // 현재 값을 2로 나눈 몫을 저장
		i--;

		if (ab == 0)     // 입력된 값의 절대값이 0일 될 때까지 반복
			break;
	}

	if (n < 0) {  // 음수일 때 (2의 보수 적용)
		for (i = 0; i < 32; i++) {  // 2진수 1의 보수로 변환
			o[i] = 1 - b[i];        // 1은 0으로 0은 1로
		}

		int carry = 1;  // 자림 올림수 여부를 알려주는 변수
		for (i = 31; i >= 0; i--) {  // 1의 보수에 +1
			if (o[i] == carry)       // o[i]와 carry의 값이 같으면 0
				t[i] = 0;
			else                     // 다르면 1
				t[i] = 1;

			carry = o[i] * carry;    // 이전 carry와 o[i]가 모두 1이면 1이 됨
		}

		printf("2진수 : ");          // 2진수(2의 보수) 출력
		for (i = 0; i < 32; i++)
		{
			printf("%d", t[i]);
			bin[i] = t[i];
			if (i % 4 == 3)  // 가독성을 위해 추가한 코드
				printf(" ");
		}
		printf("\n");
	}
	
	else {  // 양수일 때 2진수 그대로 출력
		printf("2진수 : ");
		for (i = 0; i < 32; i++)
		{
			printf("%d", b[i]);
			bin[i] = b[i];
			if (i % 4 == 3)  // 가독성을 위해 추가한 코드
				printf(" ");
		}
		printf("\n");
	}
}

void octal(int bin[]) {   // 2진수를 8진수로 변환
	int t[11];    // 8진수 배열
	int j = 10;
	int N = 0, n;

	for (int i = 31; i >= 0; i--) {  // 8진수 구하기 (마지막 자리부터 저장)
		n = (31 - i) % 3;            // 몇 승인가
		N += bin[i] * pow(2, n);     // 2진수 3자리의 합

		if (i % 3 == 2 || i == 0) {  // 3자리에 한 번씩 j에 -1하여 나눠줌
			t[j] = N;   // 현재 j 자리에 N값 저장
			j--;        // 한 자리 앞으로 이동
			N = 0;      // 다시 0으로 설정
		}
	}

	printf("8진수 : ");  // 8진수 출력
	for (int i = 0; i <11; i++) {
		printf("%d", t[i]);
		if ((10 - i) % 3 == 0) // 가독성을 위해 추가한 코드
			printf(" ");
	}
	printf("\n");
}

void hexa(int bin[]) {   // 2진수를 16진수로 변환
	// 16진수에서 나타나는 숫자들을 저장
	char H[16] = { '0', '1', '2','3','4','5','6','7','8','9','A','B','C','D','E','F' };  
	char t[8];   // 16진수 배열
	int j = 7;
	int N = 0, n;

	for (int i = 31; i >= 0; i--) {  // 16진수 구하기 (마지막 자리부터 저장)
		n = (31 - i) % 4;            // 몇 승인가
		N += bin[i] * pow(2, n);     // 2진수 4자리의 합

		if (i % 4 == 0) {  // 4자리에 한 번씩 j에 -1하여 나눠줌
			t[j] = H[N];   // 현재 j 자리에 N값을 인덱스로 한 값을 저장
			j--;           // 한 자리 앞으로 이동
			N = 0;         // 다시 0으로 설정
		}
	}

	printf("16진수 : ");   // 16진수 출력
	for (int i = 0; i < 8; i++)	{
		printf("%c", t[i]);
		if (i == 3)        // 가독성을 위해 추가한 코드
			printf(" ");
	}
	printf("\n");
}

int main() {
	int n;  // 입력 받을 정수

	printf("정수를 입력해주세요 (-2147483648 ~ 2147483647 사이 값만 입력해 주세요) : ");
	scanf("%d", &n);    // 정수 입력받기

	int bin[32] = { 0, };  // 8진수와 16진수를 변환할 때 사용할 2진수 배열
	binary(n, bin);        // 2진수로 변환
	octal(bin);            // 8진수로 변환
	hexa(bin);             // 16진수로 변환
}

'Algorithm' 카테고리의 다른 글

[Programmers] Lv. 1 짝수와 홀수  (0) 2022.09.10
[Algorithm] 배열 채우기  (0) 2020.12.02
[백준 BOJ] 1929번 소수 구하기  (0) 2020.11.04
[백준 BOJ] 1978번 소수 찾기  (0) 2020.11.04
[백준 BOJ] 10845번 큐  (0) 2020.11.04

댓글