C语言的进制转换以及算法实现

楔子

2021-1-20,天气阴,今天感觉乱糟糟的,心态也不好,什么都提不起兴趣来,唉,这疫情什么时候才能结束啊!!!


1、其他进制转十进制

  • 1.1、二进制转十进制
    转换规程: 从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和,例如:
	二进制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11

  • 1.2、八制转十进制
    转换规则: 从最低位开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和,例如:
	八进制 0123 = 3*8^0 + 2*8^1 + 1*8^2 = 3+16+64 = 83
  • 1.3、十六进制转十进制
    转换规则: 从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和,例如:
		十六进制 0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 10+64+768 = 842

2、十进制转其他进制

  • 2.1、十进制转二进制binary
    规则: 将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制,故此法叫做除商逆序取余法
    案例: 将56转换为二进制
	5656 / 2 = 280
	28 / 2 = 140 
	14 / 2 = 70
	7 / 2 = 31
	3 / 2 = 11
	1 / 2 = 0156转换为二进制的结果是:111000

代码实现:

#include <stdio.h>

//转十进制二进制
void main() {
	printf("请输入一个十进制数:");
	int binary = 0; //二进制数
	int b = 1; //循环标志		 
	int num[100] ; //用来存二进制的数组
	int index = 0;	//数组的下标
	int count = -1; //用来计算数组的使用个数,这里使用-1是因为数组的下标是从0开始的
	//所以当我们循环一次去自增的时候,第一次应该是从0开始,如果count的初始值是0的话
	//就会导致使用的第一个数组的下标为1,那样会导致存数据的下标index和记录使用的下标count不一致
	//使数据溢出
	scanf("%d",&binary);
	while (b) {
		num[index] = binary % 2; //每次运算取余
		binary /= 2; //每次运算二进制数需要除以2
		//printf("num[%d]=%d\n",index,num[index]);
		index++; //每循环一次数组下标就移一位
		count++; //每循环一次就表示占用了数组的一个位置
		if (binary == 0) {
			b = 0;
		}
	}
	printf("占用数组位置%d个",count+1);
	printf("\n");
	printf("二进制数为:");
	for (int i = count; i >=0; i--) { 
			printf("%d",num[i]);
	}
	getchar();
	getchar();//回车会被接收,所以需要两个来暂停控制台
}
  • 2.2、十进制转八进制octonary
    规则: 将该数不断除以8,直到商为0,然后将每步得到的余数倒过来,就是对应的八进制。
    **案例:**将156转换为八进制
	156156 / 8 = 194
	19 / 8 = 23
	2 / 8 = 02156转换为八进制的结果是:0234

代码实现:

#include <stdio.h>
//十进制转八进制
#define TRUE 1 //宏定义 true为1
#define FALSE 0//宏定义 false为0
void main() {
	int num[100]; //定义数组用来存储转换后的八进制数
	int octonary = 0; //十进制数
	int b = TRUE; //循环赋值的标志
	int index = 0; //存储八进制位数的下标
	int count = -1; //八进制数的位数
	printf("请输入一个十进制数:");
	scanf("%d",&octonary);
	while (b) {
		num[index++] = octonary % 8; //获取余数
		octonary /= 8; //累除
		count++;
		if (octonary == 0) { //当octonary为0时,表示已经除完了,除到底了,这时候只需要将所得到的的余数
			b = FALSE;		//倒过来就是需要求的八进制数了
		}
	}
	printf("占用数组位置%d个\n",count+1);
	printf("八进制数为:");
	for (int i = count; i >= 0; i--) {
		printf("%d",num[i]);
	}

	getchar();
	getchar();

}
  • 2.3、十进制转十六进制HEX(hexadecimal)
    规则: 将该数不断除以16,直到商为0,然后将每步得到的余数倒过来,就是对应的十六进制。
    案例: 将356转换成十六进制
	356:
	356 / 16 = 224
	22 / 16 = 16
	1 / 16 = 01356转换为十六进制的结果为0x164

代码实现:

#include <stdio.h>
#include <stdbool.h>
//十进制转换为十六进制
void main() {
	int hexadecimal = 0;
	printf("请输入一个十进制数:");
	scanf("%d",&hexadecimal);
	bool b = true;
	int index = 0;//数组的下标
	int num[100];//用来存储转换后十六进制
	while (b) {
		num[index++] = hexadecimal % 16;
		hexadecimal /= 16;
		if (hexadecimal == 0) {
			b = false;
		}
	}
	printf("占用数组的位置%d个\n",index);
	printf("转换后的十六进制数为:");
	for (int i = index-1; i >= 0; i--) {
		printf("%d",num[i]);
	}
	getchar();
	getchar();
}

3、二进制转其他进制

  • 3.1、二进制转八进制
    规则: 从低位开始,将二进制数每三位一组(111表示7)分组,不够的用0补充,将每一组转换成对应的八进制即可
    案例: 将11010101转成八进制
	11010101:对其进行三位一体分组
	第一组:101 ——>  5
	第二组:010 ——>  2
	第三组:011 ——>  3
	故,二进制11010101对应的八进制数是:0325
  • 3.2、二进制转十六进制
    规则: 从低位开始,将二进制数每四位一组(1111表示F)进行分组,转成对应的十六进制数即可
    案例: 将11010101转成十六进制
	11010101:对其进行四位一体分组
	第一组:0101 ——> 5
	第二组:1101 ——> 13
	故,二进制11010101转换为十六进制数是:0xD5

4、其他进制转二进制

  • 4.1、八进制转二进制
    规则: 将八进制数的每一位,转换成对应的一个三位的二进制数即可
    案例: 将0237转成二进制
	0237:每一位对应三位二进制数进行拆分
	第一组 7 ——> 111
	第二组 3 ——> 011
	第三组 2 ——> 010
	故,八进制数0237转换为二进制为:10011111
  • 4.2、十六进制转二进制
    规则: 将十六进制数的每一位,转换成对应的一个四位的二进制数即可
    案例: 将0X23B转换成二进制数
	0x23B:每一位对应四位二进制数进行拆分
	第一组 B ——> 1011
	第二组 3 ——> 0011
	第三组 2 ——> 0010
	故,0x23B转换为二进制数为:1000111011
  • 47
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值