#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진수로 변환
}
댓글