我已經編寫了用於將十進制數字轉換爲二進制數據的代碼,但是它反之亦然,我怎樣才能完成這項工作? 我可以使用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
你可以每個值寫入到一個數組,然後打印從它的最後一個元素的數組倒退。 –