C语言 十进制数转化为二进制 八进制 十六进制数
程序员文章站
2022-03-08 14:56:57
...
对于刚开始学习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,不需要去考虑其他的位置。注意,该方法加入输入一个负数,前面某几位会是。
上述的代码都只适用于整数。