打印这个二进制代码...向后。在C.

时间:2011-02-04 04:08:43

标签: c binary base

#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 个答案:

答案 0 :(得分: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 :(得分:1)

你可以避免堆叠..

你是向后的,因为你从最低位数开始,转换它并打印它。

如果你先解决最高的部分,你可以反过来

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

用这个除数除以你的数字 如果它是0,不要打印任何东西..如果不是,则开始打印 将你的除数除以你的基数....例如二元除数&gt;&gt; = 1; 直到你的除数为0

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);