语言中进制的转换 道客巴巴_编程基础学习笔记——进制转换及其C语言实现(1)...

d2bfefbb8aea7d4d5ee712e851da9f4e.png

对于十进制的数字“12345”来说,其真实大小就是:

即每一个位置的字符,仅能表示从0到9共十个意思,十个大小。当数字超过9之后,通过增加一个位置的字符来表达更大的数字。对于多位的数字的表达,则是通过每一位的字符乘以它进制大小的位置次幂求和来得到。


所以,对于二进制数字“10101”来说,其真实大小就是:

如果用十进制来表示“10101”这个二进制数字的话,就是“21”。


通过这个 思想,可以将任意进制的数字转化为十进制。

比如对于三进制的“21112”来说,其真实大小就是:

即其十进制下的表达为“203”。


同理,可以将这个思路逆向进行,以将十进制的数字转化为任意的进制表达。

比如,对于十进制下的数字“21”,若要将它表达为二进制数字:

首先将“21”这个数字除以2,看是否能够整除,如果能整除,则说明二进制表达中最小的一位是0,否则最小的一位是21除以2的余数。这就跟十进制中“如果30除以10,余数为0,则说明30的十进制表达中个位数为0”是一个道理。

接着再用除2后向下取整的十进制数确定二进制表达中第二小的位数字符,直到21这个数反复除以2变为0;

写出来的话就是:

21%2 = 1 ->二进制最后一位为 1;

21/2 = 10 、 10%2 = 0 ->二进制倒数第二位为0;

10/2 = 5 、 5%2 = 1 ->二进制倒数第三位为1;

5/2 = 2 、 2%2 = 0 ->二进制倒数第四位为0;

2/2 = 1 、 1%2 = 1 ->二进制倒数第五位为1;

1/2=0 ->结束。

即十进制数“21”表达为二进制的话就是“10101”。


这个算法思路其实就是用二进制数字一位一位的来表达十进制数字,每当用去一位二进制字符,十进制也相应的少去一个

的大小。对于执行程序的机器来说,这样的算法简单明了。

其余任意进制的转化都是和二进制同理的,写出函数来的话,就是:

void ten_to_b (int * num,int b,int x)
{
	int i = 0;
	while(x)
	{
		num[i] = x%b;
		x/=b;
		i++;
	}
}

即,将十进制数x转化为b进制数字,并逆序的一位一位存入了数组num中。


遵循上面所说的思路,如果输入了一个b进制的数字,想要写一个函数将其转换为十进制输出的话,首先要将数字一位一位的存入数组,然后每一位乘以b的位数幂,求总和再输出。写出函数来的话,就是:

int b_to_ten (int * num,int x,int b)
{
	int i = 0;
	while(x)
	{
		num[i] = x % 10;
		x /= 10;
		i++;
	}
	int j,zonghe=0,danwei=1;
	for(j=0;j<i;j++)
	{
		zonghe += num[j]*danwei;
		danwei *= b;
	}
	return zonghe;
}

至此就已经实现了任意进制转化为任意进制的程序编写了,若在给函数增加一个使数组逆序,并且对于大于9的数字转化为'A'、'B'...等字符输出的功能,就实现了<stdlib.h>库下的itoa()函数的全部功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值