Frage

  

Mögliche Duplizieren:
   Gibt es einen printf-Wandler im binären Format drucken?

Studieren C und ich habe mich gefragt:

eine Nummer ist es möglich, so etwas wie das folgende?

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

Oder würde ich habe meine eigene Methode zu schreiben, um die Transformation zu tun, um zu binäre?

War es hilfreich?

Lösung

Ja (schreiben Sie Ihre eigenen), so etwas wie die folgende komplette Funktion.

#include <stdio.h> /* only needed for the printf() in main(). */
#include <string.h>

/* 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;
}

Fügen Sie diese Haupt zu Ende ist es in Betrieb zu sehen:

#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;
}

Führen Sie es mit "progname 0 7 12 52 123" zu bekommen:

[  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')

Andere Tipps

Es gibt keinen direkten Weg (das heißt mit printf oder anderer Standard-Library-Funktion), es zu drucken. Sie müssen Ihre eigene Funktion schreiben.

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

Wenn Sie Terminal verwenden, können Sie Steuercodes verwenden, um auszudrucken Bytes in natürlicher Reihenfolge:

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

Basierend auf dirkgently Antwort , aber seine zwei Fehler, und immer den Druck eine feste Anzahl von Ziffern Festsetzung:

void printbits(unsigned char v) {
  int i; // for C89 compatability
  for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1));
}
#include<iostream>
#include<conio.h>
#include<stdlib.h>
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;
}

Verwenden Sie eine Lookup-Tabelle, wie:

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

dann jedes knabbern wie folgt drucken

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

Sicherlich kann man nur einen Tisch verwenden, aber es wird geringfügig schneller und zu groß.

Dieser Code soll Ihre Bedürfnisse bis zu 64 Bit verarbeiten.



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

Sie haben eine eigene Transformation zu schreiben. Nur dezimal, hex und Oktalzahlen mit Formatbezeichner unterstützt.

Es gibt keine direkten Formatbezeichner für diesen in der C-Sprache. Obwohl ich diesen schnellen Python-Schnipsel schrieb Ihnen helfen, den Prozess Schritt für Schritt zu verstehen Ihre eigene Rolle.

#!/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

Erklärt:

dez = Eingang ( „eine Dezimalzahl eingeben umwandeln:“) - der Benutzer auffordern, für eine numerische Eingabe (es gibt mehr Möglichkeiten, dies in C über Scanf zum Beispiel zu tun)

base = 2 - geben Sie unsere Basis ist 2 (binär)

Lösung = "" - Erstellen Sie einen leeren String, in dem wir unsere Lösung verketten wird

, während Dezember> = base: - während unsere Zahl ist größer als die Basis eingegeben

Lösung = str (Dezember% Base) + Lösung - den Modul der Zahl an die Basis bekommen, und es zu Beginn unserer Zeichenfolge hinzufügen (wir Zahlen von rechts nach links mit Teilung müssen hinzufügen und Rest-Methode). die Str () Funktion konvertiert das Ergebnis der Operation in einen String. Sie können nicht ohne eine Typumwandlung ganze Zahlen mit Strings in Python verketten.

dez = Dezember / base - die Dezimalzahl durch die Basis in preperation teilt den nächsten Modulo zu nehmen

, wenn Dezember> 0:      Lösung = str (Dezember) + Lösung - wenn überhaupt etwas übrig ist, fügen Sie es an den Anfang (dies wird 1, wenn etwas sein)

Drucklösung - drucken die Endzahl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top