29.【C语言】进制转换:10转16、10转2、2转10、16转10(Demo)

算法思想:

在对于10转其他进制可以利用短除法的思想,将10进制数转换成其他进制数。,如下图所示,x为进制,num为十进制数
在这里插入图片描述

1、10进制转16进制主体部分

void DecToHex(int num)		//10进制转16进制
{
	char str[N];
	int i = 0, index;
	while (num)
	{
		index = num % 16;
		if (index < 9)
			str[i] = index + '0';
		else
			str[i] = index-10 + 'a';
		num /= 16;
		i++;
	}
	str[i] = 0;
	reverse_str(str, i);		//将字符串逆序
	fputs(str, stdout);
}

2、10进制转2进制主体部分

void DecToBin(int num)		//10进制转2进制
{
	int i = 0, index;
	char str[N];
	while (num)
	{
		index = num % 2;
		str[i] = index + '0';
		num /= 2;
		i++;
	}
	str[i] = 0;
	reverse_str(str, i);		//将字符串逆序
	fputs(str, stdout);
}

3、2进制转10进制主体部分

用num表示当前取到对应十进制数的个位,在每次取num之前需要将存放结果的变量result乘2,最后加上个位数num,每趟循环读取字符串中的字符时都执行这三步,最后result就是结果值。

int BinToDec(char* str)
{
	int i = 0,num,result=0;
	while (str[i]&&str[i]!='\n')
	{
		result <<=1;		//左移1位,相当于*2
		num = str[i] - '0';
		result += num;
		i++;
	}
	return result;
}

4、16进制转10进制主体部分

用num表示当前取到对应十进制数的个位,在每次取num之前需要将存放结果的变量result乘16,最后加上个位数num,每趟循环读取字符串中的字符时都执行这三步,最后result就是结果值。

int HexToDec(char* str)
{
	int i = 0, num, result = 0;
	while (str[i] && str[i] != '\n')
	{
		result <<= 4;		//左移4位,相当于*16
		if (str[i] >= 'a')
			num = str[i] - 'a' + 10;
		else
			num = str[i] - '0';
		result += num;
		i++;
	}
	return result;
}

完整代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
void reverse_str(char* str, int len);		//数组逆序
void DecToHex(int num);		//10转16
void DecToBin(int num);		//10转2
int BinToDec(char* str);	//2转10
int HexToDec(char* str);	//16转10

int main(void)
{
	//int num;
	//printf("输入10进制数为:");
	//scanf("%d", &num);
	//printf("10进制数%d在16进制下为:",num);
	//DecToHex(num);
	//printf("\n");
	//printf("10进制数%d在2进制下为:", num);
	//DecToBin(num);
	//printf("\n");

	char str[N];
	printf("输入二进制数为:");
	fgets(str, sizeof(str), stdin);
	BinToDec(str);
	printf("转换成十进制数为:%d\n", BinToDec(str));
	memset(str, 0, sizeof(str));		//清0
	printf("输入十六进制数为:");
	fgets(str, sizeof(str), stdin);
	HexToDec(str);
	printf("转换成十进制数为:%d\n", HexToDec(str));
	system("pause");
	return 0;
}

void DecToHex(int num)		//10进制转16进制
{
	char str[N];
	int i = 0, index;
	while (num)
	{
		index = num % 16;
		if (index < 9)
			str[i] = index + '0';
		else
			str[i] = index-10 + 'a';
		num /= 16;
		i++;
	}
	str[i] = 0;
	reverse_str(str, i);		//将字符串逆序
	fputs(str, stdout);
}

void DecToBin(int num)		//10进制转2进制
{
	int i = 0, index;
	char str[N];
	while (num)
	{
		index = num % 2;
		str[i] = index + '0';
		num /= 2;
		i++;
	}
	str[i] = 0;
	reverse_str(str, i);		//将字符串逆序
	fputs(str, stdout);
}

int BinToDec(char* str)
{
	int i = 0,num,result=0;
	while (str[i]&&str[i]!='\n')
	{
		result <<=1;		//左移1位,相当于*2
		num = str[i] - '0';
		result += num;
		i++;
	}
	return result;
}

int HexToDec(char* str)
{
	int i = 0, num, result = 0;
	while (str[i] && str[i] != '\n')
	{
		result <<= 4;		//左移4位,相当于*16
		if (str[i] >= 'a')
			num = str[i] - 'a' + 10;
		else
			num = str[i] - '0';
		result += num;
		i++;
	}
	return result;
}

void reverse_str(char* str, int len)
{
	int low = 0, high = len - 1;
	while (low < high)
	{
		char temp = str[low];
		str[low] = str[high];
		str[high] = temp;
		low++;
		high--;
	}
}

案例运行效果:

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值