欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言实现十进制数转二进制数的算法

程序员文章站 2022-03-08 15:49:22
...

因为C语言的printf函数的格式化输出只支持八进制和十六进制的输出,所以二进制需要自己实现。

这其中有几个难点,一是算法,二是数据结构。可以用二不断除被除数取余数,倒序输出,还可以像我这么想,用位运算和移位操作进行输出,因为本身在内存中就是二级制的形式存放的,可以直接操作位。

算法描述:

1.对十进制数与1与操作,结果为二进制数的末位,保存到数组

2.对十进制数进行右移操作,保存在临时变量中

3.查看临时变量是否为零,是则到4,否则到1

4.倒序输出数组

数据结构的难点在于C语言不支持动态数组,需要在编译时指定数组的大小,所以需要对十进制数转化成二进制有多少位进行事先统计,方法就是对其不断除以2,直到为零,统计除法次数就是位数。

代码如下

#include <stdio.h>
int *toBinary(int bitArray[],int n,int size);
int bitNum(int n); 

	int a = 12345;
	
	int size = bitNum(a);
	int bitArray[size];
	printf("a is:%d sizeof bin is:%d\n",a,size);
	int *pToArray = toBinary(bitArray,a,size);
	int i;

	for(i=0;i<size;i++){
		printf("%d",*(pToArray+i));
	}
	//toBinary(a,size);
}
int bitNum(int n){
	int m = n;
	int count=0;
	while(m!=0){
		m=m/2;
		count++;
	}
	return count;
}
int *toBinary(int bitArray[],int n,int size){
	int count;
	int m = n;
	for(count=size-1;count>=0;count--){
		//printf("m now is=%d and m&1 now is%d:\n",m,m&1);
		bitArray[count]=m&1;
		//printf("count now is:%d,and array[%d] is:%d\n",count,count,binArray[count]);
		m=m>>1;
		//printf("after m>>1 the m is:%d\n",m);
	}
	for(count=0;count<size;count++){
		printf("%d",bitArray[count]);
	}
	printf("\n");
	return bitArray;
}

有一点需要特别注意的是,一开始在函数中打印数组的内容是正常的,但是将这个数组返回指针在主函数里读取就会是垃圾值。百思不得其解。究其原因发现,函数快中声明的数组属于临时变量,出了函数就被销毁,所以即使返回他的指针,用的时候那块地址的内存已被清楚,所以输出垃圾值。正确的做法应该将数组作为参数传递进函数,最终返回这个数组的指针,这时候数组还在主函数中,未被销毁,所以通过指针可以访问其中的内容。

个人原创 欢迎一切批评的声音。