进制转换(C语言)

进制转换:

输入一个M(2、8、10、16)进制的数,转换为其他三种进制的功能

  • 一、需求分析

I.实现的功能:
输入一个(2、8、10、16)进制的数,将其转换为其他进制

  • 二、概要设计

先把输入的数都转化为相应十进制的数,然后通过调用子函数,再转换为二进制、八进制,十六进制输出
进制转换(C语言)_第1张图片

  • 三、详细设计

Main函数
{
(1)char arr[] ={0};用来存放输入的数,因为要对输入的num的每一位进行操作,所以把该数组类型定义为字符串,所以,此时不能用scanf来输入,否则去其每一位比较复杂,用gets来输入。

(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;
}

二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”

例如:
进制转换(C语言)_第2张图片

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输入二进制
进制转换(C语言)_第3张图片

num=777输入八进制
进制转换(C语言)_第4张图片
num=0FFAB输入十六进制
进制转换(C语言)_第5张图片

  • 五、程序代码


#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

// 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 :%s\n", 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)