概述
进制转换:
输入一个M(2、8、10、16)进制的数,转换为其他三种进制的功能
-
一、需求分析
I.实现的功能:
输入一个(2、8、10、16)进制的数,将其转换为其他进制
-
二、概要设计
先把输入的数都转化为相应十进制的数,然后通过调用子函数,再转换为二进制、八进制,十六进制输出
-
三、详细设计
Main函数
{
(1)char arr[] ={0};用来存放输入的数,因为要对输入的num的每一位进行操作,所以把该数组类型定义为字符串,所以,此时不能用scanf来输入,否则去其每一位比较复杂,用gets来输入。
<gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’n’,它会把换行符替换成空字符’ ’,作为c语言字符串结束的标志。
(2)strlen函数把gets读入的字符放到str[]中,size记录有几个字符数,size做后面的循环变量
(3)将输入的数全部转化为十进制数
输入为二进制和八进制时,每一个数字可以减去字符‘0’而转换成数字;
if (arr[i] >= ‘0’ && arr[i] <= ‘9’)
{
temp = arr[i] - ‘0’; //字符类型转换为数字
}
而十六进制时,当数值位大于9时,即10—A,11-B,12-C,13-D,14-E,15-F要转将字母转换成数字,减去字符‘A’在加10即可
else if (num >= 10 && (arr[i] >= ‘A’ && arr[i] <= ‘A’ + num - 10))
{
temp = arr[i] - ‘A’ + 10; //十六进制字符转化为数字
num = num * n + temp;
}
二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”
例如:
1.十进制转二进制
{
Binary_Exchange(num);//十进制转二进制
}
通过移位,这个语句,是在把十六进制表示的0x80000000和传递过来的num 的值进行位运算 &;
以输入的num = 5 来举例:
因为数字保存在计算机中都是补码表示,而正数的补码就是源码,所以5在计算机中保存的二进制形式为
0000 0000 0000 0000 0000 0000 0000 0101(32位)
上述语句将它和 0x80000000 进行位&运算:0x80000000在计算机中的二进制保存形式为:
1000 0000 0000 0000 0000 0000 0000 0000;
如果此时num的二进制第一位为 1 时,1xxxx(32位,x不管为1或者0)& 0x80000000 都= 0x80000000;
否则第一位为 0 时不管后面为什么都不等于0x80000000;
借由这个特性可以判断此时二进制的第一位是1 还是 0;
再下来就是 i >>= 1语句了,这是在把num的二进制右移一位,此时原来二进制的第二位就变为第一位了,再和0x800000000判断;
通过
for (i = 0x80000000; i; i >>= 1)
这个循环将二进制右移32次,使每一位都可以和0x80000000进行比较判定。
这样依次输出就是num的二进制表示;
2.十进制转八进制
{void Octal_Exchange(int m)} //十进制转八进制
{
temp = m % 8;//
Octal_Exchange(m /= 8);通过取模在相除,拿到八进制下num的每一位数
}
3.十进制转十六进制
int Hexa_Exchange(int a)
{
//通过取模在相除,拿到十六进制下num的每一位数,放入arr[]中,当arr[i]>9时,对应的位十六进制的A,B,C,D,E,F。由于‘9’的ASCII为57,当arr[i]=10时,其对应的ASCII+7刚好是‘A’;
然后%s打印该字符串,就是num的十六进制数;
}
同理,十进制转二进制也可以用取模在相除的方法
-
四、测试结果
num=1010输入二进制
num=777输入八进制
num=0FFAB输入十六进制
-
五、程序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 10 -> 2
void Binary_Exchange(int a)
{
int arr1[50] = { 0 };
int tmp = 0;
unsigned int i;
printf("The Binary number is :");
for (i = 0x80000000; i; i >>= 1)
//0x80000000实际代表的二进制值是1000,0000,0000,0000,0000,0000,0000,0000
//是在把十六进制表示的0x80000000和传递过来的num 的值进行位运算 &;
//int类型表示的最小值
{
tmp = ((a & i) == i);
printf("%d", tmp);
}
}
// 10 -> 8
void Octal_Exchange(int m)
{
int temp = 0;
if (m == 0)
return;
temp = m % 8;
Octal_Exchange(m /= 8);
printf("%d", temp);
}
// 10 -> 16
int Hexa_Exchange(int a)
{
int i = 0;
int count = 0, temp = 0;
char arr[20] = { 0 };
temp = a;
while (temp)
{
arr[i] = temp % 16;
temp /= 16;
count++;
}
for (i = 0; i < count; i++)
{
if (arr[i] > 9)
{
arr[i] += 7;
}
arr[i] += '0';
}
printf("The Hexa number is :%sn", arr);
return a;
}
int main()
{
int num = 0;
char arr[] = { 0 };
int i = 0, size = 0;
int n = 0, temp = 0;
printf("请输入要转化的数:");
//scanf("%s", &num);
gets(arr);
size = strlen(arr);
printf("请输入该数的进制(2、8、16):");
scanf("%d", &n);
for (i = 0; i < size; i++)
{
if (arr[i] >= '0' && arr[i] <= '9')
{
temp = arr[i] - '0'; //字符类型转换为数字
}
else if (arr[i] >= 'A' && arr[i] <= 'F')
{
temp = arr[i] - 'A' + 10; //十六进制字符转化为数字
}
num = num * n + temp;
}
Binary_Exchange(num);
printf("n");
printf("The Octal number is :");
Octal_Exchange(num);
printf("nThe Dec number is :%d", num);
printf("n");
Hexa_Exchange(num);
printf("n");
system("pause");
return 0;
}
8.十进制转二进制的另一个方法
//int main()
//{
// int n;
// printf("请输入一个十进制数:n");
// scanf("%d", &n);
// unsigned int i = 1u << 15;
// for (; i; i >>= 1) {
// printf("%d", n&i ? 1 : 0);
// }
// printf("n");
// return 0;
//}
//通过移位,代码中的i必须用unsigned int 无符号整型来表示,
//初始化i = 1, 后面的u表示的就是unsigned,
//<< 15表示向左移位15个bit
//(本代码输出的是十六位的二进制数,如果想输出32位的二进制数,只需将15变为31即可)
//将0000000000000001中的1向左移位15就得到了1000000000000000,接下来就是for循环,
//就是单纯的让1慢慢向后移一位,例如第二次循环就变为了0100000000000000,
//同理下去。&表示的是按位与运算符。
最后
以上就是彩色花瓣为你收集整理的进制转换(C语言)的全部内容,希望文章能够帮你解决进制转换(C语言)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复