十进制转二进制

  将十进制转换为二进制,基本思路是这样的:首先判断这个数是奇数还是偶数,如果是奇数,那么二进制数的最后一位为1,否则为0。这个采用模2运算即可。然后来分析其他位,确定二进制倒数第二位,也可以采用模2运算,但是需要将二进制的最后一位舍弃,也就是向右移一位。举个简单的例子,9的二进制表示为1001,那么对9模2运算,也就是9%2=1,那么最后一位为1,这个时候将9向右移一位9>>1,也就是做除(/)运算,结果为4,再模2,4%2=0。得出倒数第二位。一直到这个十进制数小于2,结束所有操作。这是基本思路,下面直接上代码:

 1 #include<stdio.h>
 2 
 3 void to_binary(unsigned long n);//函数声明
 4 
 5 int main(int argc, char* argv[])
 6 {
 7     int n ;
 8     printf("Enter a number , I will change it to binary: (Q Quick)\n");    
 9     
10     while (scanf("%d",&n)==1)
11     {
12         to_binary(n);//调用函数,将十进制数传入
13         printf("\nEnter a number , I will change it to binary: (Q Quick)\n");    
14     }
15     return 0;
16 }
17 
18 void to_binary(unsigned long n){
19     int r;
20     
21     r = n % 2;//对n模2,求出二进制最后一位
22 
23     if (n >= 2)
24         to_binary(n>>1);//递归调用
25 
26     putchar('0' + r);//打印二进制数
27     return 0;
28 }

  这里有三点要注意:

  1.对于求出二进制的每一位我们可以使用循环来求出,但是在上面的程序中,我们使用了递归调用。递归在层数不多的情况下是具有较高的运算速度,但是由于递归调用会增大系统额外的开销,消耗系统资源,所以在层数较多的情况下并不适用。但是一般面试时,面试官会考察递归,所以在平时的编程中应该尽量熟悉。

  2.我们在打印二进制数的时候,并没有对每一位是0还是1做判断。而是借助一个int变量r和字符'0',如果r为0,那么字符'0'+0,还是'0';如果r为1,那么字符'0'+1会打印出字符'1'。因为'1'的ASCALL码比'0'的ASCALL码大1。所以不需要做判断。

  3.程序说输入q结束程序,其实不仅仅是q,只要输入的是非数字值,都会退出循环。

posted @ 2015-05-15 18:13  轩宇一页  阅读(1327)  评论(0编辑  收藏  举报