2011-02-04 50 views
0
#include <stdio.h> 
#include <math.h> 
/* converts to binary */ 

int main() 
{ 
    unsigned int decimalNUM = 0; 
    printf("Enter a number to be converted to binary.\t"); 
    scanf("%d", &decimalNUM); 
    fflush(stdin); 
    baseConv(decimalNUM); 
    getchar(); 
    return 0; 
} 
baseConv(unsigned int n){ 
if (n == 0) ; 
     while (n > 0){ 
     printf("%d", n%2); 
     n = n >> 1; 
       } 
return 0; 
} 

我知道如何現在這樣做,但它向後打印。我將如何去扭轉它?向後打印此二進制代碼。在C

+0

步驟1:在發佈代碼之前,修復編譯器警告。第2步:在你的問題中包含代碼 - 除非它比這更多的行。 – 2011-02-04 04:15:38

+0

編譯器警告...?! – tekknolagi 2011-02-04 04:28:51

回答

6

如果您想要一種方式來顛倒這樣的操作,一種方法是使用堆棧數據結構。

不是在主循環中打印值,而是將它們推入堆棧。

然後,一旦你完成了,從堆棧中彈出一個項目並打印它,然後繼續這樣做,直到堆棧爲空。一個堆棧被稱爲LIFO結構(後進先出),並且是一種方便的方式來存儲事物,以便以後以與生成的相反順序進行檢索。

僞代碼:

def baseConv (n): 
    create stack s 
    while n > 0: 
     push n % 2 onto s 
     n = n >> 1 
    while not empty(s): 
     pop n from s 
     print n 

我還要補充一點的說法:

if (n == 0); 

並沒有真正做任何有用的。

1

您可以避免堆棧..

您是倒退,因爲你是從最低的數字,轉換它,並打印出來。

你可以去其他的方式輪,如果你制定出最高的部分第一

找到最高除數爲你的基地比如int二進制爲0x8000

除以該除數 如果您的號碼的0,不要打印任何東西..如果它不是,開始打印 除以您的基數除數....例如二進制除數>> = 1; 直到您的除數爲0

0

您可以通過打開所有位(〜unsigned(0))來獲得最高有效位的值,然後將該值與其自身進行XOR異常右移。然後,測試每個位從MSB到LSB ...

for (unsigned x = ~unsigned(0)^(~unsigned(0) >> 1); x; x >>= 1) 
    putchar(x & n ? '1' : '0'); 
0

分配一個字符串足夠大,用「0」填滿它,把1分的成以相反的順序串,發現第一個「1」和打印字符串從這一點開始

int cursor, lead_one; 
char *buffer = malloc(sizeof(unsigned int)*8 + 1); 
memset(buffer, '0', sizeof(unsigned int)*8); 
buffer[sizeof(unsigned int)*8] = 0; 

for (lead_one = cursor = sizeof(unsigned int)*8 - 1; n > 0; cursor--) { 
    if (n & 1) { 
     buffer[cursor] = '1'; 
     lead_one = cursor; 
    } 
    n >>= 1; 
} 
printf(buffer+lead_one);