Programming

c/c++ 진법 변환(2, 8, 10, 16)

h34hg0 2022. 5. 1. 12:29

n진수를 10진수로 변환


n진수를 10진수로 변환

ABCD = A * n^3 + B * n^2 + C * n^1 + D * n^0


10진수를 n진수로 변환


10진수를 n진수로 변환


C언어로 진법 변환 구현


notation.h

//notation.h

char* convertBin(char* number);
char* converterOct(char* number);
int convertDec(char* number);
char* convertHex(char* number);
int isBin(char* number);
int isOct(char* number);
int isDec(char* number);
int isHex(char* number);
int whatNotation(char* number);

notation.c

//notation.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "notation.h"

char* convertBin(char* number) {
	char numberSet[] = { '0' ,'1'};
	int count = 0, decimal = convertDec(number);
	char result[100] = "0b";
	for (count; decimal != 0; count++) {
		decimal = decimal / 2;
	}
	decimal = convertDec(number);
	for (int i = count + 2; i > 2; i--) {
		result[i - 1] = numberSet[decimal % 2];
		decimal = decimal / 2;
	}
	result[count + 2] = '\0';
	return result;
}
char* convertOct(char* number) {
	char numberSet[] = { '0' ,'1', '2', '3', '4', '5', '6', '7', '8'};
	int count = 0, decimal = convertDec(number);
	char result[100] = "0o";
	for (count; decimal != 0; count++) {
		decimal = decimal / 8;
	}
	decimal = convertDec(number);
	for (int i = count + 2; i > 2; i--) {
		result[i - 1] = numberSet[decimal % 8];
		decimal = decimal / 8;
	}
	result[count + 2] = '\0';
	return result;
}
int convertDec(char* number) { 
	int notation = whatNotation(number);
	if (strlen(number) == 1 && notation == 10) {
		return number[0] - '0';
	}
	int sum = 0;
	char memory[100];
	char* tmp = tmp = _strlwr(strcpy(memory, number + 2));

	if (notation == 10) {
		for (int i = 0; i < strlen(number); i++) {
			sum += (number[i] - '0') * pow(notation, strlen(number) - 1 - i);
		}
		return sum;
	}
	else if (notation == 16) {
		for (int i = 0; i < strlen(tmp); i++) {
			if ('a' <= tmp[i] && tmp[i] <= 'f') {
				sum += (tmp[i] - 'a' + 10) * pow(notation, strlen(tmp) - 1 - i);
			}
			else {
				sum += (tmp[i] - '0') * pow(notation, strlen(tmp) - 1 - i);
			}
		}
		return sum;
	}
	else if(notation == 2 || notation == 8){
		for (int i = 0; i < strlen(tmp); i++) {
			sum += (tmp[i] - '0') * pow(notation, strlen(tmp) - 1 - i);
		}
		return sum;
	}
	else
		return 0;
}
char* convertHex(char* number) {
	char numberSet[] = { '0' ,'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
	int count = 0, decimal = convertDec(number);
	char result[100] = "0x";
	for (count; decimal != 0; count++) {
		decimal = decimal / 16;
	}
	decimal = convertDec(number);
	for (int i = count + 2; i > 2; i--) {
		result[i - 1] = numberSet[decimal % 16];
		decimal = decimal / 16;
	}
	result[count + 2] = '\0';
	return result;
}

int isBin(char* number) {
	if (strlen(number) == 1)
		return 0;
	char memory[100];
	char* tmp = strcpy(memory, number + 2);
	
	if (!(number[0] == '0' && (number[1] == 'b' || number[1] == 'B'))) {
		return 0;
	}

	for (int i = 0; i < strlen(tmp) - 1; i++) {
		if (!('0' <= tmp[i] && tmp[i] <= '1')) {
			return 0;
		}
	}
	return 1;
}
int isOct(char* number) {
	if (strlen(number) == 1)
		return 0;
	char memory[100];
	char* tmp = strcpy(memory, number + 2);
	if (!(number[0] == '0' && (number[1] == 'o' || number[1] == 'O')))
		return 0;

	for (int i = 0; i < strlen(tmp) - 1; i++) {
		if (!('0' <= tmp[i] && tmp[i] <= '7')) {
			return 0;
		}
	}
	return 1;
}

int isDec(char* number) {
	if (strlen(number) == 1)
		if('0' <= number[0] && number[0] <= '9')
			return 1;
	char memory[100];
	for (int i = 0; i < strlen(number); i++) {
		if (!('0' <= number[i] && number[i] <= '9')) {
			return 0;
		}
	}
	return 1;
}

int isHex(char* number) {
	if (strlen(number) == 1)
		return 0;
	char memory[100];
	char* tmp = strcpy(memory, number + 2);
	if (!(number[0] == '0' && (number[1] == 'x' || number[1] == 'X')))
		return 0;
	tmp = _strlwr(tmp);
	for (int i = 0; i < strlen(tmp); i++) {
		if (!(('0' <= tmp[i] && tmp[i] <= '9') || ('a' <= tmp[i] && tmp[i] <= 'f'))) {
			return 0;
		}
	}
	return 1;
}

int whatNotation(char* number) {
	if (isBin(number)) {
		return 2;
	}
	else if (isOct(number)) {
		return 8;
	}
	else if (isDec(number)) {
		return 10;
	}
	else if (isHex(number)) {
		return 16;
	}
	return 0;
}

main.c

//main.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "notation.h"


void main() {
	char number[100];
	scanf("%s", number);
	printf("Bin : %s\n", convertBin(number));
	printf("Oct : %s\n", convertOct(number));
	printf("Dec : %d\n", convertDec(number));
	printf("Hex : %s", convertHex(number));
}

실행 결과


255 입력
0xff 입력
0b11111111 입력