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;
}
有一点需要特别注意的是,一开始在函数中打印数组的内容是正常的,但是将这个数组返回指针在主函数里读取就会是垃圾值。百思不得其解。究其原因发现,函数快中声明的数组属于临时变量,出了函数就被销毁,所以即使返回他的指针,用的时候那块地址的内存已被清楚,所以输出垃圾值。正确的做法应该将数组作为参数传递进函数,最终返回这个数组的指针,这时候数组还在主函数中,未被销毁,所以通过指针可以访问其中的内容。
个人原创 欢迎一切批评的声音。
上一篇: (牛客剑指offer刷题33)数组中只出现一次的数字
下一篇: C语言实现十进制转二进制