问题描述
- for里面的printf是怎么执行的
-
/*把一个十进制数以二进制输出*/
#includeint main(void)
{
const int bit = sizeof(int) * 8; //判断整型有多少位
unsigned int bak = 1 << bit-1; //一个数只有第一位为1,其余全为0
int num;
int i;printf("请输入一个数:"); scanf("%d", &num); for(i = 1; i <= bit; ++i) { /* if(num & bak) //相与的结果只有0或者不是0,不是0则输出字符1 { printf("%c", '1'); } else { printf("%c", '0'); } bak = bak >> 1; //每一次把bak右移一位 */ printf("%c", num < 0 ? '1' : '0'); num <<= 1; } printf("n"); return 0;
}
解决方案
10进制转2进制,
每次除以2,输出余数,将余数反过来就是结果,举例:
123
123 % 2 = 1
123 /2 = 61
61 % 2 = 1
61 / 2 = 30
30 % 2 = 0
30 / 2 = 15
15 % 2 = 1
15 / 2 = 7
7 % 2 = 1
7 / 2 = 3
3 % 2 = 1
3 / 2 = 1
1 % 2 = 1
1 / 2 = 0
所以结果(从下往上列出余数)1111011
解决方案二:
void print_2(int val2)
{
unsigned char p = (unsigned char)&val2 + 3; //从低位到高位,低端字节计算机
for(int k = 0; k <= 3; k++)
{
int val2 = *(p-k);
for (int i = 7; i >= 0; i--)
{
if(val2 & (1 << i))
printf("1");
else
printf("0");
}
printf(" ");
}
}
解决方案三:
printf("%c", num < 0 ? '1' : '0'); 表示如果num<0就输出字符'1',否则就输出字符'2'
解决方案四:
打错了 是表示如果num<0就输出字符'1',否则就输出字符'0'
解决方案五:
回车表示从缓存中提交数据到程序,空格只是隔开数据。你输入3,空格,此时数据并没提交到程序中,3还在缓存中,所以不执行printf。
解决方案六:
这是一个十进制转二进制的经典例子
老曹的答案太牛了,赞一下
解决方案七:
scanf("%d", &num);改成scanf("%s", &num);
int i= strlen(num);
int x = atoi(num);
printf("%o", x);
解决方案八:
61 / 2 = 30
30 % 2 = 0
30 / 2 = 15
15 % 2 = 1
15 / 2 = 7
7 % 2 = 1
7 / 2 = 3
3 % 2 = 1