#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;
}
我知道如何现在这样做,但它向后打印。我该如何改变呢?
答案 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);