一道十进制转二进制的题

#include<stdio.h>voidprintb(intx,intn);intmain(){intx;printf("inputnumber:");scanf("%... #include <stdio.h>

void printb(int x, int n);

int main()
{
int x;
printf("input number:");
scanf("%d",&x);
printf("it's binary from: ");
printb(x, sizeof(int) * 8);//这里的*8是不是每位的字节数来乘以int的8位,具体是什么意思?
putchar('\n');
system("pause");
return 0;
}
void printb(int x, int n)
{
if( n>0 )
{
putchar('0' + ((unsigned)(x&(1<<(n-1)))>>(n-1)));//这是不懂的地方,1,对putchar的用法不是特别清楚,还有,2,((unsigned)(x&(1<<(n-1)))>>(n-1))要怎么理解,为什么还要unsigned还有&操作符是什么意思
printb(x, n-1);//或许上面的懂了,这里的递归可能也懂了
}
}
希望学c语言的帮忙解决下,谢谢了~~这道题的原意是因为十进制本来在机子里面就是二进制,所以想直接把它输出。
展开
 我来答
匿名用户
2010-02-06
展开全部
printb(x, sizeof(int) * 8);

这里的sizeof(int)返回int类型的字节宽度,乘以8就是int类型的二进制位宽度,将这个值传入此函数,作用就是控制输出的二进制位宽度。

((unsigned)(x&(1<<(n-1)))>>(n-1))

由内而外看,1<<(n-1)是将1按位左移n-1位,这样将得到一个新的数字,这个新数字的第n位是1,其余各位都是0,将这个新数字与x执行按位与运算后,得到了一个新值,这个值的第n位和x的第n位相同,其余各位都是0,然后再将这个值按位右移n-1位,使原来的第n位成为第1位,这样,((unsigned)(x&(1<<(n-1)))>>(n-1))的值就是x第n位上的值了(0或者1),为了确保在右移位的过程中受符号位的影响,所以在右移之前用(unsigned)将其转换为无符号数。然后在用putchar()函数将结果输出的屏幕上,由于putchar()用于输出字符,所以必须要将0或者1转换为对应的ASCII字符,其方法就是'0'加上0或者1

输出完第n位之后,就可以接着输出第n-1位了,所以接着递归调用 printb(x, n-1) 输出第n-1位。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式