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;
}

我现在知道该怎么做,但它会向后打印。我将如何扭转它?

4

4 回答 4

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);

根本没有做任何有用的事情。

于 2011-02-04T04:11:38.693 回答
1

你可以避免堆栈..

你倒退了,因为你从最低位开始,转换它,然后打印它。

如果你先计算出最高的部分,你可以反过来

为您的基础找到一个 int 的最高除数,例如二进制 0x8000

如果它为0,则将您的数字除以该除数,则不打印任何内容..如果不是,则开始打印除以您的除数...例如二进制除数>> = 1; 直到你的除数为 0

于 2011-02-04T04:37:25.863 回答
0

您可以通过打开所有位 (~unsigned(0)) 来获得最高有效位的值,然后将该值与自身右移进行异或运算。然后,测试从 msb 到 lsb 的每一位...

for (unsigned x = ~unsigned(0) ^ (~unsigned(0) >> 1); x; x >>= 1)
    putchar(x & n ? '1' : '0');
于 2011-02-04T05:32:56.097 回答
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);
于 2011-02-04T07:15:43.050 回答