Десятичный в двоичный - PullRequest
       51

Десятичный в двоичный

14 голосов
/ 27 октября 2011

У меня есть число, которое я хотел бы преобразовать в двоичный (из десятичного числа) в C.

Я бы хотел, чтобы мой двоичный файл всегда был в 5 битах (десятичное число никогда не превышало 31).У меня уже есть функция, которая делает это вручную путем деления, но трудно заполнить ее до 5 битов.

Есть ли более простой способ?Возможно, с использованием побитового сдвига?

Я также хотел бы, чтобы двоичный файл был представлен в char *

Ответы [ 12 ]

0 голосов
/ 03 октября 2012
#include <stdio.h>
#include <string.h>

char numstr[9024];
int i = 0;

void format(int n, int base);
void printreverse(char *s);

int main()
{
     int testnum = 312;    // some random test number
     format(testnum, 2);   // 2 for binary
     printreverse(numstr);
     putchar('\n');

     return 0;
}

void format(int n, int base)
{
    if (n > 0) {
        char tmp = (n % base) + '0';
        numstr[i++] = tmp;

        // If we put this above other two we don't need printreverse,
        // But then we will have unwanted results in other places of numstr if we can't reset it

        format(n/base, base); 
    } else
        numstr[i] = '\0'; // terminating character
}

void printreverse(char *s)
{
    long len = strlen(s);
    while (len-->0)
        putchar(s[len]);
}
0 голосов
/ 27 октября 2011

Поскольку вы работаете только с 5 битами, почему бы не использовать справочную таблицу?Что-то вроде следующего:

/* Convert nstr to a number (decimal) and put a string representation of the
 * lowest 5 bits in dest (which must be at least 6 chars long) */
void getBinStr(char *dest, const char *nstr)
{
  char *lkup[32] = { 
    "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111",
    "01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111",
    "10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111",
    "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" };
  strcpy(dest, lkup[atoi(nstr) & 0x1f]);
}

Или переключатель:

void getBinStr(char *dest, const char *nstr)
{
  switch (atoi(nstr)) {
    case 31:  strcpy(dest,"11111"); break;
    case 30:  strcpy(dest,"11110"); break;
    ...
    case 1:   strcpy(dest,"00001"); break;
    case 0:   strcpy(dest,"00000"); break;
    default:  strcpy(dest,"error");
  }
}

Или, если это кажется слишком длинным, может быть что-то вроде следующего:

void getBinStr(char *dest, const char *nstr)
{
  unsigned x = atoi(nstr);
  dest[0] = (x & 0x10) ? '1' : '0';
  dest[1] = (x & 0x08) ? '1' : '0';
  dest[2] = (x & 0x04) ? '1' : '0';
  dest[3] = (x & 0x02) ? '1' : '0';
  dest[4] = (x & 0x01) ? '1' : '0';
  dest[5] = '\0';
}

Iобычно предпочитает один из первых двух, но последний может быть лучше, если по какой-то причине другие слишком велики (например, код для небольшого микроконтроллера).

Все они предполагают, что вы хотите, чтобы результат оставался дополненнымнули до 5 бит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...