преобразование десятичного числа в двоичное - PullRequest
2 голосов
/ 26 февраля 2020

Я написал код, который преобразует целые десятичные числа в двоичные. Я пытаюсь заставить его печатать все числа до указанного числа вместо того, чтобы печатать одно и то же число каждый раз. например, для input = 3 он напечатает 0,1,2,3 в binariy. это мой код:

printf("Please enter an integer number\n");
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
    printf("%d ==   ", n);

    for (c = 5; c >= 0; c--)
    {
        k = n >> c;

        if (k & 1)
            printf("1");
        else
            printf("0");
    }

    printf("\n");
}
system ("pause");
return 0;

спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы также можете просто вывести отдельные символы с помощью putchar(), не нужно вызывать переменную c printf для вывода фиксированного символа в строке формата (хотя хороший компилятор, скорее всего, сделает оптимизацию за вас.

Вы можете сделать что-то похожее на:

#include <stdio.h>
#include <limits.h>

int main (void) {

    unsigned n;
    fputs ("enter an integer number: ", stdout);
    if (scanf ("%u", &n) == 1) {
        for (unsigned i = 0; i < n; i++) {
            printf ("%d ==   ", i);
            for (unsigned s = 0; s < sizeof s * CHAR_BIT; s++)
                putchar ((i >> (31 - s)) & 1u ? '1' : '0');
            putchar ('\n');
        }
    }
}

Пример использования / Вывод

$ ./bin/binslessthann
enter an integer number: 10
0 ==   00000000000000000000000000000000
1 ==   00000000000000000000000000000001
2 ==   00000000000000000000000000000010
3 ==   00000000000000000000000000000011
4 ==   00000000000000000000000000000100
5 ==   00000000000000000000000000000101
6 ==   00000000000000000000000000000110
7 ==   00000000000000000000000000000111
8 ==   00000000000000000000000000001000
9 ==   00000000000000000000000000001001

(конечно, нет необходимости в полные 32-разрядные для небольших чисел, но они были включены для полноты)

двоичное представление без заполнения

Как отмечено в комментариях, версия без дополнения значительно упрощает результаты читать. (цитата была "ужасные начальные нули"). Чтобы вывести незаполненную версию, вы можете сначала проверить, равно ли значение нулю, если да, просто вывести ноль, то для значений с однобитовыми значениями вы проверяете, остались ли эти биты. в значении после сдвига, если это так, продолжайте выводить биты, иначе больше ничего не выводите, например,

int main (void) {

    unsigned n;
    fputs ("enter an integer number: ", stdout);
    if (scanf ("%u", &n) == 1) {
        for (unsigned i = 0; i < n; i++) {
            printf ("%d ==   ", i);
            if (!i)
                putchar ('0');
            else {
                unsigned s = sizeof s * CHAR_BIT;
                while (s--) {
                    unsigned remain = i >> s;
                    if (remain)
                        putchar ((i >> s) & 1u ? '1' : '0');
                }
            }
            putchar ('\n');
        }
    }
}

Пример использования / Вывод

$ ./bin/binslessthanrem
enter an integer number: 10
0 ==   0
1 ==   1
2 ==   10
3 ==   11
4 ==   100
5 ==   101
6 ==   110
7 ==   111
8 ==   1000
9 ==   1001

L окей вещи и дайте мне знать, если у вас есть дополнительные вопросы.

1 голос
/ 26 февраля 2020

Вам нужно работать с i в l oop, а не n

#include "stdio.h"



int main()
{
    int c,k,n,i = 0;
    printf("Please enter an integer number\n");
    scanf_s("%d", &n);
    for (i = 0; i < n; i++)
    {
        printf("%d ==   ", i);

        for (c = 5; c >= 0; c--)
        {
            k = i >> c;

            if (k & 1)
                printf("1");
            else
                printf("0");
        }

        printf("\n");
    }

    return 0;
}
...