распечатать этот двоичный код ... назад.в С - PullRequest
0 голосов
/ 04 февраля 2011
#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 ]

6 голосов
/ 04 февраля 2011

Если вы хотите отменить операцию, подобную этой, одним из способов является использование структуры данных стека.

Вместо того, чтобы печатать значения в вашем основном цикле, поместите их в стек.

Затем, когда вы закончите, вытолкните элемент из стека и распечатайте его, затем продолжайте делать это, пока стек не опустеет.Стек известен как структура 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 голос
/ 04 февраля 2011

Вы можете избежать стека.

Вы находитесь в обратном направлении, потому что вы начинаете с самой младшей цифры, конвертируете ее и печатаете.

Вы можете пойти наоборот, если высначала определите самую высокую часть

найдите самый высокий делитель для целого числа для вашей базы, например, для двоичного 0x8000

разделите ваше число на этот делитель, если его 0, ничего не печатайте .. еслиэто не так, начните печатать делите ваш делитель на базу .... например двоичный делитель >> = 1;пока ваш делитель 0

0 голосов
/ 04 февраля 2011

Выделите строку, достаточно большую, и заполните ее '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);
0 голосов
/ 04 февраля 2011

Вы можете получить значение старшего значащего бита, включив все биты (~ unsigned (0)), а затем присвоив XOR значение, смещенное вправо. Затем проверьте каждый бит от msb до lsb ...

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