我是靠谱客的博主 彩色花瓣,这篇文章主要介绍进制转换(C语言),现在分享给大家,希望可以做个参考。

进制转换:

输入一个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输入十六进制
在这里插入图片描述

  • 五、程序代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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语言)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部