进制转换(C语言编程代码+超详解析)
浅析进制的转换原理:
进制也就是进位制,做加法运算时满 x 进 1,做减法时借 1 当 x,这就是 x 进制,包含 x 个数字即区间 [0, x-1],基数为 x;十进制有 0~9 共10个数字,基数为10,在加减法运算中,满10进1,借1当10。
进制表
十进制数 | 二进制数 | 八进制数 | 十六进制数 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
1 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
如果是16,这与之相对应的10000 20 0x10
n进制到十进制的转换
使用按权展开求和方法
二进制转十进制:1101=1X2³+1X2²+0X2¹+1X2⁰
十六进制转十进制:4C=4X16¹+12X16⁰
让我们看一下二进制转换成十进制的代码吧
#include <stdio.h>
#include <math.h>
int main() {
long long binary;
int decimal = 0, i = 0, remainder;
printf("请输入一个二进制数:");
scanf("%lld", &binary);
while (binary != 0) {
remainder = binary % 10;
binary /= 10;
decimal += remainder * pow(2, i);
++i;
}
printf("转换后的十进制数为:%d", decimal);
return 0;
}
十进制转化n进制的转换
整除法
- 二进制:将十进制数不断除以2,直到商为0,然后将所有的余数倒序排列即可得到二进制数。
- 八进制:将十进制数不断除以8,直到商为0,然后将所有的余数倒序排列即可得到八进制数。
- 十六进制:将十进制数不断除以16,直到商为0,然后将所有的余数倒序排列,将10-15分别用A-F代替即可得到十六进制数。
- 其他进制:将十进制数不断除以目标进制,直到商为0,然后将所有的余数倒序排列即可得到目标进制数。
#include <stdio.h>
// 将十进制数转换为二进制
void decimalToBinary(int n) {
int binaryNum[32];
int i = 0;
while (n > 0) {
binaryNum[i] = n % 2;
n = n / 2;
i++;
}
for (int j = i - 1; j >= 0; j--) {
printf("%d", binaryNum[j]);
}
}
// 将十进制数转换为八进制
void decimalToOctal(int n) {
int octalNum[100];
int i = 0;
while (n > 0) {
octalNum[i] = n % 8;
n = n / 8;
i++;
}
for (int j = i - 1; j >= 0; j--) {
printf("%d", octalNum[j]);
}
}
// 将十进制数转换为十六进制
void decimalToHexadecimal(int n) {
char hexaDecimalNum[100];
int i = 0;
while (n != 0) {
int temp = 0;
temp = n % 16;
if (temp < 10) {
hexaDecimalNum[i] = temp + 48;
} else {
hexaDecimalNum[i] = temp + 55;
}
i++;
n = n / 16;
}
for (int j = i - 1; j >= 0; j--) {
printf("%c", hexaDecimalNum[j]);
}
}
int main() {
int decimalNum;
printf("Enter a decimal number: ");
scanf("%d", &decimalNum);
printf("Binary: ");
decimalToBinary(decimalNum);
printf("\nOctal: ");
decimalToOctal(decimalNum);
printf("\nHexadecimal: ");
decimalToHexadecimal(decimalNum);
return 0;
}
其他进制相互转换
有些进制之间不能直接转换是因为它们之间的表示方式和数值系统不同。进制是一种表示数字的方式,它使用不同的基数来确定数字的权重。常见的进制包括十进制(基数为10)、二进制(基数为2)、八进制(基数为8)和十六进制(基数为16)。
当两个进制之间的基数不同,转换就会变得复杂。例如,将二进制转换为十进制,需要根据权重计算每个位上的值,然后将它们相加。同样地,将十进制转换为二进制,需要将数字逐步除以2,并记录余数,直到商为0为止。
总之,进制之间的转换需要根据不同的基数和表示方式进行计算,因此有些进制之间不能直接转换。
二进制八进制相互转换
三合一:
将二进制数转换为八进制的方法是将二进制数按照三位一组进行分割,然后将每组转换为对应的八进制数。如果最后一组不足三位,可以在最前面补0凑成三位。下面是一个示例:
假设要将二进制数 110110110 转换为八进制数:
- 将二进制数按照三位一组进行分割: 110 110 110
- 然后将每组转换为对应的八进制数: 6 6 6
- 所以二进制数110110110转换为八进制数为666。
接下来是C语言代码示例,用于将二进制数转换为八进制数:
#include <stdio.h>
#include <math.h>
int main() {
long long binaryNumber;
int octalNumber = 0, decimalNumber = 0, i = 0;
// 输入二进制数
printf("Enter a binary number: ");
scanf("%lld", &binaryNumber);
// 将二进制数转换为十进制数
while (binaryNumber != 0) {
decimalNumber += (binaryNumber % 10) * pow(2, i);
++i;
binaryNumber /= 10;
}
i = 1;
// 将十进制数转换为八进制数
while (decimalNumber != 0) {
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
printf("The octal number is: %d", octalNumber);
return 0;
}
二进制十六进制相互转换
四合一:
将二进制数转换为十六进制数的方法是将二进制数按照四位一组进行分割,然后将每组转换为对应的十六进制数。如果最后一组不足四位,可以在最前面补0凑成四位。下面是一个示例:
假设要将二进制数 110110110 转换为十六进制数:
- 将二进制数按照四位一组进行分割: 1101 1011 0
- 然后将每组转换为对应的十六进制数: D B 0
- 所以二进制数110110110转换为十六进制数为DB0。
接下来是C语言代码示例,用于将二进制数转换为十六进制数:
#include <stdio.h>
#include <string.h>
int main() {
char binaryNumber[100], hexaDecimal[100];
int i = 0;
// 输入二进制数
printf("Enter a binary number: ");
scanf("%s", binaryNumber);
// 补0凑成四位
int length = strlen(binaryNumber);
int extra = 4 - (length % 4);
if(extra != 4) {
for(int j = 0; j < extra; j++) {
binaryNumber[length + j] = '0';
}
}
binaryNumber[length + extra] = '\0';
// 将二进制数转换为十六进制数
length = strlen(binaryNumber);
while(length > 0) {
int temp = 0;
for(int j = 0; j < 4; j++) {
temp = temp * 2 + (binaryNumber[i] - '0');
i++;
}
if(temp < 10) {
hexaDecimal[length/4 - 1] = temp + '0';
} else {
hexaDecimal[length/4 - 1] = temp - 10 + 'A';
}
length -= 4;
}
hexaDecimal[i] = '\0';
printf("The hexadecimal number is: %s", hexaDecimal);
return 0;
}
十六进制与八进制互相转换
要将十六进制数转换为八进制数,或者将八进制数转换为十六进制数,可以先将待转换的数先转换为二进制数,然后再将二进制数转换为目标进制数。下面分别介绍两种转换的方法。
- 十六进制转换为八进制:
- 将十六进制数的每一位转换为四位的二进制数,然后将所有二进制数合并在一起。
- 将得到的二进制数按照三位一组进行分割,然后将每组转换为对应的八进制数。
- 八进制转换为十六进制:
- 将八进制数的每一位转换为三位的二进制数,然后将所有二进制数合并在一起。
- 将得到的二进制数按照四位一组进行分割,然后将每组转换为对应的十六进制数。
下面是一个C语言代码示例,用于将十六进制数转换为八进制数:
#include <stdio.h>
#include <string.h>
int main() {
char hexadecimalNumber[100], binaryNumber[400], octalNumber[100];
int i = 0;
// 输入十六进制数
printf("Enter a hexadecimal number: ");
scanf("%s", hexadecimalNumber);
// 将十六进制数转换为二进制数
int length = strlen(hexadecimalNumber);
for(int j = 0; j < length; j++) {
switch(hexadecimalNumber[j]) {
case '0':
strcat(binaryNumber, "0000");
break;
case '1':
strcat(binaryNumber, "0001");
break;
case '2':
strcat(binaryNumber, "0010");
break;
case '3':
strcat(binaryNumber, "0011");
break;
case '4':
strcat(binaryNumber, "0100");
break;
case '5':
strcat(binaryNumber, "0101");
break;
case '6':
strcat(binaryNumber, "0110");
break;
case '7':
strcat(binaryNumber, "0111");
break;
case '8':
strcat(binaryNumber, "1000");
break;
case '9':
strcat(binaryNumber, "1001");
break;
case 'A':
case 'a':
strcat(binaryNumber, "1010");
break;
case 'B':
case 'b':
strcat(binaryNumber, "1011");
break;
case 'C':
case 'c':
strcat(binaryNumber, "1100");
break;
case 'D':
case 'd':
strcat(binaryNumber, "1101");
break;
case 'E':
case 'e':
strcat(binaryNumber, "1110");
break;
case 'F':
case 'f':
strcat(binaryNumber, "1111");
break;
default:
printf("Invalid hexadecimal digit %c", hexadecimalNumber[j]);
return 1;
}
}
// 补0凑成三位
length = strlen(binaryNumber);
int extra = 3 - (length % 3);
if(extra != 3) {
for(int j = 0; j < extra; j++) {
binaryNumber[length + j] = '0';
}
}
binaryNumber[length + extra] = '\0';
// 将二进制数转换为八进制数
length = strlen(binaryNumber);
i = 0;
while(length > 0) {
int temp = 0;
for(int j = 0; j < 3; j++) {
temp = temp * 2 + (binaryNumber[i] - '0');
i++;
}
octalNumber[i/3] = temp + '0';
length -= 3;
}
octalNumber[i/3] = '\0';
printf("The octal number is: %s", octalNumber);
return 0;
}