目录
一、二进制
1.二进制 >> 八进制
2.二进制 >> 十进制
3. 二进制 >> 十六进制
二、八进制
1.八进制 >> 二进制
2.八进制 >> 十进制
3.八进制 >> 十六进制
三、十进制
1.十进制 >> 二进制
2.十进制 >> 八进制
3.十进制 >> 十六进制
四、十六进制
1.十六进制 >> 二进制
2.十六进制 >> 八进制
3.十六进制 >> 十进制
方法一:可以通过先将二进制转换为十进制,然后再将十进制转换为八进制的方式来间接实现
方法二:直接按每三位一组处理二进制数,并直接转换为对应的八进制数
下面为方法一的代码:
int Convert2_10(long long n) //先将二进制数转成十进制
{
int i = 0; //用于表示第几位二进制数
int n_10 = 0; //得到的十进制数
int ret = 0; //每次取余后的数
while (n != 0)
{
ret = n % 10;
n /= 10;
n_10 += ret*pow(2, i);
i++;
}
return n_10;
}
int Convert2_10_8(int n) //将得到的十进制数转成八进制数
{
int i = 1;
int n_10 = Convert2_10(n);
int n_8 = 0;
while (n_10 != 0)
{
n_8 += (n_10 % 8) * i;
n_10 /= 8;
i *= 10;
}
return n_8;
}
int main()
{
long long n_2 = 0; //对于 long long,应该使用 %lld打印
int n_8 = 0;
printf("请输入一个二进制数:");
scanf("%d", &n_2);
n_8 = Convert2_10_8(n_2);
printf("二进制数%lld转换为八进制数为:%d\n", n_2, n_8);
return 0;
}
int Convert2_10(const char* n)
{
int sum = 0;
int length = strlen(n);
for (int i = 0; i < length; i++)
{
sum += (n[i] - '0') * pow(2, length - i - 1);
}
return sum;
}
int main()
{
char n[100]; // 假设二进制数不超过99位
int ret = 0;
printf("请输入一个二进制数:");
scanf("%99s", &n);
// 检查输入是否有效(只包含'0'和'1')
for (int i = 0; n[i] != '\0'; i++)
{
if (n[i] != '0' && n[i] != '1')
{
printf("输入的不是有效的二进制数!!!\n");
return 1;
}
}
ret = Convert2_10(n);
printf("二进制数%s转换为十进制数为:%d\n", n, ret);
return 0;
}
两种方法:
方法一:限制输入标准的二进制数,必须是4的倍数
char* convert2_16(const char* n)
{
size_t len = strlen(n); //计算二进制数的长度
if (len == 0 || len % 4 != 0) // 如果输入为空或长度不是4的倍数,则返回NULL
{
return NULL;
}
// 分配足够的空间来存储转换后的十六进制字符串(包括结尾的'\0')
//长度为二进制长度除以4(因为4位二进制等于1位十六进制)加1(为'\0')
char* hex = (char*)malloc((len / 4) + 1);
if (!hex)
{
return NULL;
}
// 遍历二进制字符串,每次处理4个字符
size_t i, j = 0;
for (i = 0, j = 0; i < len; i += 4, j++)
{
unsigned n_16 = 0;
for (size_t k = 0; k < 4; k++)
{
n_16 = n_16 * 2 + (n[i + k] - '0');
}
// 将计算出的十六进制值转换为对应的字符,并存储在结果字符串中
hex[j] = "0123456789ABCDEF"[(int)n_16];
}
hex[j] = '\0'; // 添加字符串结束符
return hex;
}
int main()
{
char n_2[65]; // 假设二进制数不超过64位
printf("请输入一个二进制数:");
scanf("%64s", &n_2); // 读取输入的二进制字符串(最多64位)
char* hex = convert2_16(n_2);
printf("二进制数%s转换成十六进制数为:0x%s\n",n_2, hex);
free(hex); // 释放之前分配的内存
return 0;
}
方法二:无限制输入的字符个数
int main()
{
long long n_2 = 0;
long int n_16 = 0;
int i = 1;
int remainder = 0;
printf("请输入一个二进制数: ");
scanf("%lld", &n_2);
while (n_2 != 0)
{
remainder = n_2 % 10;
n_16 = n_16 + remainder * i;
i = i * 2;
n_2 = n_2 / 10;
}
printf("转换得到的十六进制数为: %lX\n", n_16);
return 0;
}
思路:先把八进制数转成十进制数,再转换成二进制数
int convert8_10(int n) //8 >> 10
{
int n_10 = 0;
int i = 0;
while (n != 0)
{
n_10 += (n % 10) * pow(8, i);
i++;
n /= 10;
}
return n_10;
}
long long convert8_10_2(int n) //10 >> 2
{
long long n_2 = 0;
int n_10 = convert8_10(n); //得到十进制数
int i = 1;
while (n_10 != 0)
{
n_2 += (n_10 % 2) *i;
n_10 /= 2;
i *= 10;
}
return n_2;
}
int main()
{
int n_8 = 0;
long long n_2 = 0;
printf("请输入一个八进制数:");
scanf("%d", &n_8);
n_2 = convert8_10_2(n_8);
printf("八进制数%d转换为二进制数为:%lld\n", n_8, n_2);
return 0;
}
例子:1234(8进制)= 1*8^3+2*8^2+3*8^1+4*8^0=668(10进制)。
int Convert8_10(long long n)
{
int num = 0;
int i = 0;
while (n != 0)
{
num += (n % 10) * pow(8, i);
i++;
n /= 10;
}
return num;
}
int main()
{
int n_8 = 0;
int n_10 = 0;
printf("请输入一个八进制数:");
scanf("%d", &n_8);
n_10 = Convert8_10(n_8);
printf("八进制数%d转换为十进制数为:%d\n", n_8, n_10);
return 0;
}
C语言中转换八进制到十六进制可以使用sprintf()函数。
int main()
{
long n_8 = 0;
char n_16[10];
printf("请输入一个八进制数:");
scanf("%o", &n_8);
sprintf(n_16, "%X", n_8);
printf("八进制数%o转换成十六进制数为:%s\n", n_8, n_16);
return 0;
}
/两个参数:一个十进制数n;一个指向字符数组(字符串)的指针binary,这个字符数组将用于存储转换后的二进制数。
void Convert10_2(int n, char *binary)
{
int i = 0; // 用于跟踪在binary数组中当前的位置
while (n > 0)
{
binary[i++] = (n % 2) + '0';
//计算n除以2的余数,这个余数就是n的二进制表示中的最低位
//然后将这个余数加上字符'0'的ASCII码值,将其转换为对应的字符'0'或'1'
// 并将这个字符存储在binary数组的当前位置
n /= 2;
// 更新n为n除以2的商,为下一次迭代准备
}
// 添加字符串结束符
binary[i] = '\0';
// 因为我们是从最低位开始存储的,所以需要反转字符串
int start = 0;
int end = i - 1;
while (start < end)
{
char temp = binary[start];
binary[start] = binary[end];
binary[end] = temp;
start++;
end--;
}
}
int main()
{
int n_10 = 0;
char n_2[33]; // 假设整数不超过32位
printf("请输入一个十进制数:");
scanf("%d", &n_10);
Convert10_2(n_10, n_2);
printf("十进制数%d转换为二进制数为:%s\n", n_10, n_2);
return 0;
}
long convert10_8(int n)
{
int n_8 = 0, i = 1;
// 从十进制数开始迭代
while (n != 0)
{
n_8 += (n % 8) * i;
n /= 8;
i *= 10;
}
return n_8;
}
int main()
{
int n_10;
printf("请输入一个十进制数: ");
scanf("%d", &n_10);
long n_8 = convert10_8(n_10);
printf("十进制数%d转换成八进制数为:%ld\n", n_10, n_8);
return 0;
}
int main()
{
int n_10 = 0;
char n_16[10];
printf("请输入一个十进制数:");
scanf("%d", &n_10);
sprintf(n_16, "%X", n_10); // 将十进制数转成十六进制字符串
printf("十进制数%d转换成十六进制数为:%s\n", n_10, n_16); // 输出十六进制数
return 0;
}
int main()
{
char hex[17]; //定义一个数组
int i = 0;
// 读入16进制数
printf("请输入16进制数:");
scanf("%s", &hex);
printf("对应的2进制数为:");
while (hex[i])
{
switch (hex[i])
{
case '0':
printf("0000");
break;
case '1':
printf("0001");
break;
case '2':
printf("0010");
break;
case '3':
printf("0011");
break;
case '4':
printf("0100");
break;
case '5':
printf("0101");
break;
case '6':
printf("0110");
break;
case '7':
printf("0111");
break;
case '8':
printf("1000");
break;
case '9':
printf("1001");
break;
case 'A':
case 'a':
printf("1010");
break;
case 'B':
case 'b':
printf("1011");
break;
case 'C':
case 'c':
printf("1100");
break;
case 'D':
case 'd':
printf("1101");
break;
case 'E':
case 'e':
printf("1110");
break;
case 'F':
case 'f':
printf("1111");
break;
default:
printf("\n错误:无效的16进制数!\n");
return 0;
}
i++;
}
return 0;
}
基本思路:可以通过:16 >> 10 >> 8
int main()
{
char n_16[10];
int n_8 = 0;
printf("请输入一个十六进制数:");
scanf("%s", &n_16);
long int n_10 = strtol(n_16, NULL, 16); //16 >> 10
int i = 1;
while (n_10 != 0) //10 >> 8
{
n_8 += (n_10 % 8) * i;
n_10 /= 8;
i *= 10;
}
printf("十六进制数%s转换成八进制数为:%d\n", n_16, n_8);
return 0;
}
可以使用C语言中的strtol函数来将十六进制字符串转换为十进制数
基本结构:long int strtol(const char *str, char **endptr, int base);
其中,第一个参数str是需要转换的字符串;
第二个参数endptr是一个指向字符指针的指针,用于存储转换后未处理的部分;
第三个参数base是转换后的数值进制,一般使用16表示十六进制。
int main()
{
char n_16[10];
printf("请输入一个十六进制数:");
scanf("%s", &n_16);
long int n_10 = strtol(n_16, NULL, 16);
printf("十六进制数%s转换成十进制数为:%d\n", n_16, n_10);
return 0;
}