对于刚开始学习C语言的来说,我们知道%d可以表示十进制的数,%o可以表示八进制的数,%x用来表示十六进制的数,但却没有来表示二进制数的。
这就是相对应的八进制数和十六进制数
#include <stdio.h> int main() { int n; printf("请输入一个十进制的整数:\n"); scanf("%d",&n); printf("八进制数为:%o\n",n); printf("十六进制数为:%x\n",n); return 0; }
那么如何输入一个相对应的二进制数尼?我们知道,对于一个二进制数,只有0和1;一个十进制数转化为二进制数,就是不断模2,并且最后将模2的结果逆序输出。
下面的代码比较容易理解,但特别的繁琐。
#include <stdio.h> #define Maxsize 100 int main() { int n=0,count=0,j=0; int a[Maxsize],b[Maxsize]; printf("请输入一个十进制整数:\n"); scanf("%d",&n); if(n>=0){ while(n!=0){ a[count]=n%2; n=n/2; count++; } for(int i=count-1;i>=0;i--)//将数组逆序输出 printf("%d",a[i]); } else{ n=-n; while(n!=0){ a[count]=n%2; n=n/2; count++; } for(int i=count-1;i>=0;i--){//将逆序输出的结果保存在另一个数组中 b[j]=a[i]; j++; } for(int i=0;i<count;i++){ //取反码 if(b[i]==0) b[i]=1; else b[i]=0; } for(int i=count-1;i>=0;i--){ //将反码加1 if(b[i]==0){ b[i]=1; break; } else{ b[i]=0; } } for(int i=0;i<count;i++) printf("%d",b[i]); } printf("\n"); return 0; }
下面的代码比较简单,但不太容易理解。
#include <stdio.h> 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,同理下去。&表示的是按位与运算符。
举一个简单的例子,八位的二进制数,假设i循环为了00100000,而算求的二进制数为xx1xxxxx,我们只看与i 中的1相对应位置的数字,假设为0,则最后结果二进制数的该位就是0,若为1,最后结果二进制数的该位就为1,不需要去考虑其他的位置。注意,该方法加入输入一个负数,前面某几位会是。
上述的代码都只适用于整数。