十进制转二进制
将十进制转换为二进制,基本思路是这样的:首先判断这个数是奇数还是偶数,如果是奇数,那么二进制数的最后一位为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,只要输入的是非数字值,都会退出循环。