我已经编写了用于将十进制数字转换为二进制数据的代码,但是它反之亦然,我怎样才能完成这项工作? 我可以使用getch命令使它发生,我们正在学习getch。如何从右到左制作printf
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(;n>0;n=n/2){
int d = n%2;
printf("%d", d);
}
return 0;
}
我已经编写了用于将十进制数字转换为二进制数据的代码,但是它反之亦然,我怎样才能完成这项工作? 我可以使用getch命令使它发生,我们正在学习getch。如何从右到左制作printf
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(;n>0;n=n/2){
int d = n%2;
printf("%d", d);
}
return 0;
}
您可以通过使用递归函数变得棘手本:
#include <stdio.h>
void print_binary(int n)
{
if (n != 0) {
print_binary(n/2);
printf("%d ", n%2);
}
}
int main() {
int n;
scanf("%d", &n);
print_binary(n);
return 0;
}
通过递归调用返回后进行打印时,打印的数字按相反的顺序。
每次调用print_binary
时,它都会调用自身的参数n/2
,然后打印最低有效位。但是,每次递归调用都会执行相同的操作。
这里的调用堆栈会变成什么样子n
等于11(二进制1011):
main
scanf
print_binary(11)
print_binary(5)
print_binary(2)
print_binary(1)
print_binary(0)
printf("%d ", 1);
printf("%d ", 0);
printf("%d ", 1);
printf("%d ", 1);
你可以看到,这导致最显著位被打印的第一。
这里有一个非递归解决方案:
#include <stdio.h>
int main() {
int n;
char buf[100];
char *bp;
printf("Enter number: ");
fflush(stdout);
scanf("%d", &n);
bp = buf;
// store into array instead of printing [chars will be reversed]
// NOTE: we use "bp == buf" to force output if entered number is zero
for (; n>0 || bp == buf; n=n/2){
int d = n%2;
bp += sprintf(bp, "%d", d);
}
// print array in reverse order
for (bp -= 1; bp >= buf; --bp)
fputc(*bp,stdout);
printf("\n");
return 0;
}
可以数字存储到一个数组,扭转它,以获得正确的号码。
这是另一种方式,从最重要的位开始,以“零压抑”工作。不需要逆转。
#include <stdio.h>
int main(void) {
int n = 0; // the value
int hadone = 0; // 0 suppression control
int bits = 8 * sizeof n; // assume 8 bits for example
unsigned mask = 1u << (bits-1); // set msb of mask
scanf("%d", &n);
while(mask) {
if(n & mask) { // is it a 1 bit?
putchar('1');
hadone = 1; // cancel 0 suppression
}
else if(hadone || mask == 1) { // ensure a lone `0` goes out
putchar('0');
}
mask >>= 1; // next bit
}
putchar('\n');
return 0;
}
程序会话:
42
101010
你可以每个值写入到一个数组,然后打印从它的最后一个元素的数组倒退。 –