Отобразить двоичное представление числа в C?

Возможный дубликат:
Есть ли конвертер printf для печати в двоичном формате?

Я все еще учился, и мне было интересно:

Учитывая число, можно ли сделать что-то вроде следующего?

char a = 5; printf("binary representation of a = %b",a); > 101 

Или мне пришлось бы написать свой собственный метод, чтобы сделать преобразование в двоичное?

    Да (напишите сами), что-то вроде следующей полной функции.

     #include  /* only needed for the printf() in main(). */ #include  /* Create a string of binary digits based on the input value. Input: val: value to convert. buff: buffer to write to must be >= sz+1 chars. sz: size of buffer. Returns address of string or NULL if not enough space provided. */ static char *binrep (unsigned int val, char *buff, int sz) { char *pbuff = buff; /* Must be able to store one character at least. */ if (sz < 1) return NULL; /* Special case for zero to ensure some output. */ if (val == 0) { *pbuff++ = '0'; *pbuff = '\0'; return buff; } /* Work from the end of the buffer back. */ pbuff += sz; *pbuff-- = '\0'; /* For each bit (going backwards) store character. */ while (val != 0) { if (sz-- == 0) return NULL; *pbuff-- = ((val & 1) == 1) ? '1' : '0'; /* Get next bit. */ val >>= 1; } return pbuff+1; } данные #include  /* only needed for the printf() in main(). */ #include  /* Create a string of binary digits based on the input value. Input: val: value to convert. buff: buffer to write to must be >= sz+1 chars. sz: size of buffer. Returns address of string or NULL if not enough space provided. */ static char *binrep (unsigned int val, char *buff, int sz) { char *pbuff = buff; /* Must be able to store one character at least. */ if (sz < 1) return NULL; /* Special case for zero to ensure some output. */ if (val == 0) { *pbuff++ = '0'; *pbuff = '\0'; return buff; } /* Work from the end of the buffer back. */ pbuff += sz; *pbuff-- = '\0'; /* For each bit (going backwards) store character. */ while (val != 0) { if (sz-- == 0) return NULL; *pbuff-- = ((val & 1) == 1) ? '1' : '0'; /* Get next bit. */ val >>= 1; } return pbuff+1; } 

    Добавьте это к концу, чтобы увидеть его в действии:

     #define SZ 32 int main(int argc, char *argv[]) { int i; int n; char buff[SZ+1]; /* Process all arguments, outputting their binary. */ for (i = 1; i < argc; i++) { n = atoi (argv[i]); printf("[%3d] %9d -> %s (from '%s')\n", i, n, binrep(n,buff,SZ), argv[i]); } return 0; } 

    Запустите его с помощью "progname 0 7 12 52 123" чтобы получить:

     [ 1] 0 -> 0 (from '0') [ 2] 7 -> 111 (from '7') [ 3] 12 -> 1100 (from '12') [ 4] 52 -> 110100 (from '52') [ 5] 123 -> 1111011 (from '123') 

    Для его печати нет прямого способа (т. printf Использования printf или другой стандартной библиотечной функции). Вам нужно будет написать свою собственную функцию.

     /* This code has an obvious bug and another non-obvious one :) */ void printbits(unsigned char v) { for (; v; v >>= 1) putchar('0' + (v & 1)); } 

    Если вы используете терминал, вы можете использовать управляющие коды для вывода байтов в натуральном порядке:

     void printbits(unsigned char v) { printf("%*s", (int)ceil(log2(v)) + 1, ""); for (; v; v >>= 1) printf("\x1b[2D%c",'0' + (v & 1)); } 

    Основываясь на ответе dirkgently , но фиксируя его две ошибки и всегда печатая фиксированное количество цифр:

     void printbits(unsigned char v) { int i; // for C89 compatability for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1)); } 
     #include #include #include using namespace std; void displayBinary(int n) { char bistr[1000]; itoa(n,bistr,2); //2 means binary u can convert n upto base 36 printf("%s",bistr); } int main() { int n; cin>>n; displayBinary(n); getch(); return 0; } 

    Используйте таблицу поиска, например:

     char *table[16] = {"0000", "0001", .... "1111"}; 

    затем напечатайте каждый кусок, как это

     printf("%s%s", table[a / 0x10], table[a % 0x10]); 

    Конечно, вы можете использовать только одну таблицу, но она будет немного быстрее и слишком большой.

    Этот код должен обрабатывать ваши потребности до 64 бит.

     char* pBinFill(long int x,char *so, char fillChar); // version with fill char* pBin(long int x, char *so); // version without fill #define width 64 char* pBin(long int x,char *so) { char s[width+1]; int i=width; s[i--]=0x00; // terminate string do { // fill in array from right to left s[i--]=(x & 1) ? '1':'0'; // determine bit x>>=1; // shift right 1 bit } while( x > 0); i++; // point to last valid character sprintf(so,"%s",s+i); // stick it in the temp string string return so; } 
     char* pBinFill(long int x,char *so, char fillChar) { // fill in array from right to left char s[width+1]; int i=width; s[i--]=0x00; // terminate string do { s[i--]=(x & 1) ? '1':'0'; x>>=1; // shift right 1 bit } while( x > 0); while(i>=0) s[i--]=fillChar; // fill with fillChar sprintf(so,"%s",s); return so; } 
     void test() { char so[width+1]; // working buffer for pBin long int val=1; do { printf("%ld =\t\t%#lx =\t\t0b%s\n",val,val,pBinFill(val,so,0)); val*=11; // generate test data } while (val < 100000000); } Output: 00000001 = 0x000001 = 0b00000000000000000000000000000001 00000011 = 0x00000b = 0b00000000000000000000000000001011 00000121 = 0x000079 = 0b00000000000000000000000001111001 00001331 = 0x000533 = 0b00000000000000000000010100110011 00014641 = 0x003931 = 0b00000000000000000011100100110001 00161051 = 0x02751b = 0b00000000000000100111010100011011 01771561 = 0x1b0829 = 0b00000000000110110000100000101001 19487171 = 0x12959c3 = 0b00000001001010010101100111000011 

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

    Для языка C не существует спецификатора прямого формата. Хотя я написал этот быстрый fragment python, чтобы помочь вам понять процесс шаг за шагом, чтобы сворачивать ваши собственные.

     #!/usr/bin/python dec = input("Enter a decimal number to convert: ") base = 2 solution = "" while dec >= base: solution = str(dec%base) + solution dec = dec/base if dec > 0: solution = str(dec) + solution print solution 

    Разъяснение:

    dec = input («Введите десятичное число для преобразования:») – запросите пользователя для числового ввода (например, в C через scanf есть несколько способов сделать это)

    base = 2 – укажите, что наша база – 2 (двоичная)

    solution = “” – создать пустую строку, в которой мы будем конкатенировать наше решение

    а dec> = base: – в то время как наш номер больше, чем введенная база

    solution = str (dec% base) + solution – получить модуль числа до базы и добавить его в начало нашей строки (мы должны добавить числа справа налево, используя метод деления и остатка). функция str () преобразует результат операции в строку. Вы не можете конкатенировать целые числа со строками в python без преобразования типов.

    dec = dec / base – делить десятичное число на базу в preperation, чтобы принять следующий модуль

    если dec> 0: solution = str (dec) + solution – если что-то осталось, добавьте его в начало (это будет 1, если что-нибудь)

    решение печати – распечатать окончательный номер