10进制转2,8,16进制
注:
1.笔者在这里只写了整数的进制间转换,小数尚未介绍,有兴趣的可自行查阅
2.这里用到的自定义函数思想在冒泡排序中以提及,不再加以介绍
1.十进制转二进制
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
一般用数字0,1表示
具体做法:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,
直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的
高位有效位,依次排列起来。
eg:176 =(10110000)
176/2=88=====余0 0
88/2=44======余0 0
44/2=22=======余0 0 ↑ 列
22/2=11=======余0 0 | 排
11/2=5========余1 1 | 序
5/2=2=========余1 1 | 逆
2/2=1=========余0 0
1/2=0=========余1 1
2.十进制转八进制
十进制整数转换为八进制整数采用"除8取余,逆序排列"法。
一般用数字0~7表示
具体做法:用8整除十进制整数,可以得到一个商和余数;再用8去除商,又会得到一个商和余数,如此进行,
直到商为小于1时为止,然后把先得到的余数作为八进制数的低位有效位,后得到的余数作为八进制数的
高位有效位,依次排列起来。
注:八进制以0开头,例如十进制716 = 八进制01314。
eg: 716 =(01314)
716/8=89=======余4 4 ↑ 列
89/8=11=======余1 1 | 排
11/8=1========余3 3 | 序
1/8=0=========余1 1 | 逆
3.十进制转十六进制
十进制整数转换为十六进制整数采用"除16取余,逆序排列"法。
一般用数字0~9和字母A~F(或a~f)表示,其中A~F表示10~15。
具体做法:用16整除十进制整数,可以得到一个商和余数;再用16去除商,又会得到一个商和余数,如此进行,
直到商为小于1时为止,然后把先得到的余数作为十六进制数的低位有效位,后得到的余数作为十六进制数的
高位有效位,依次排列起来。
注:十六进制以0X或0x开头,例如十进制3225 = 十六进制C99。
eg: 3225 =(C99)
↑ 列
3225/16=201=======余9 9 | 排
201/16=12========余9 9 | 序
12/16=0=========余12(C) C | 逆
4.无限循环程序代码
while(1)
{
主体部分
printf("
按回车键继续, 按Ctrl + C退出...
");
getchar();
getchar();
}
getchar()是用来吸收回车键的
5.代码实现
因为十进制转2,8,16的方式相似, 所以笔者在这里写了一个DevNtype函数,来优化代码。
include<stdio.h>
//因为两个函数中用都用,且第一个函数得到的i要直接用到第二个函数中所以定义全局变量
int arr[10000] = {0}, i = 0;
//因为16进制会用到字母,而2,8进制不会,所以直接写一个数组用来输出转换后的数
char numtype[17] = "0123456789ABCDEF";
int DecNtype(int n, int type)//n为十进制数字,type是要转换成的类型
{
if(n == 1 && i == 0) arr[i] = 1;//因为1教特殊,所以单挑出来
else
{
arr[i] = n % type;
n = n / type;
i++;
//用到递归,直到取余等于0才停止,否则重复执行这个函数
n == 0 ? arr[i + 1] = 1 : DecNtype(n, type);
}
}
int main()
{
int type, num, j = 0;
while(1)
{
printf("Input the type of bin(2,8,16): ");//输入进制类型
scanf("%d", &type);
printf("Input a number: ");//输入十进制数字
scanf("%d", &num);
DecNtype(num, type);//调用函数做进制转换
if(type == 8) printf("0");
if(type == 16) printf("0X");
for(j = i - 1; j >= 0; j--)//16,8,2进制直接倒序输出
{
printf("%c", numtype[arr[j]]);
}
i = 0;
printf("
按回车键继续, 按Ctrl + C退出...
");
getchar();
getchar();
}
return 0;
}