2009-03-31 11 views

Respuesta

12

Sí (escriba el suyo), algo así como la siguiente función completa.

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

Añadir esta principal al final de la misma para verlo en funcionamiento:

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

Ejecutar con "progname 0 7 12 52 123" llegar:

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

Veo un desbordamiento del búfer si a la función binrep() no se le da suficiente espacio para el valor que está imprimiendo. Y, hablando de amarga (pero hace mucho tiempo) experiencia, las cosas que escriben en la parte frontal de una matriz pueden ser realmente desagradables de depurar. –

+0

Sí, eso será problemático: si sus entradas son de más de 32 bits, debe asegurarse de aumentar el tamaño de SZ. – paxdiablo

+0

Solucionado para evitar el desbordamiento del búfer. – paxdiablo

2

usted tiene que escribir su propia transformación. Solo los números decimales, hexadecimales y octales son compatibles con los especificadores de formato.

29

No hay forma directa (es decir, usando printf u otra función de biblioteca estándar) para imprimirlo. Deberá escribir su propia función.

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

Si está utilizando el terminal, puede utilizar los códigos de control para imprimir bytes en el orden natural:

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

hacks bits Niza. ¡Código ilegible FTW! –

+0

@Chris Lutz: en realidad, esto es tan simple como vienen :-) – dirkgently

+0

@Chris Lutz: estoy de acuerdo con dirkgently. La función está bien nombrada y está escrita claramente de forma lineal. Cada declaración es simple y obvia. – abelenky

2

No hay ningún especificador de formato directo para esto en el lenguaje C. Aunque escribí este breve fragmento de Python para ayudarlo a comprender el proceso paso a paso para obtener el suyo propio.

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

Explicación:

Dec = entrada ("Introduzca un número decimal a convertir:") - solicitar al usuario una entrada numérica (hay varias maneras de hacer esto en C mediante scanf por ejemplo)

base = 2 - especificar nuestra base es 2 (binario)

solución = "" - crear una cadena vacía en la que vamos a concatenar nuestra solución

, mientras que diciembre> = base: - mientras que nuestro número es más grande que la base entrado solución

= str (desc% base) + solución - Obtiene el módulo de la serie a la base, y agregarlo al comienzo de nuestra cadena (hay que sumar los números a la derecha utilizando el método de la división y el resto de la izquierda). la función str() convierte el resultado de la operación en una cadena. No puede concatenar enteros con cadenas en python sin una conversión de tipo.

Dec = Dec/base de - dividir el número decimal por la base en preparado para dar el siguiente módulo

si diciembre> 0: solución = str (dec) + solución - si nada se queda, agregarlo al principio (esto será 1, si acaso)

solución de impresión - imprimir el número final

+0

Se perdió el caso donde la entrada es 0, que no imprimirá nada en este caso. –

+0

No creo que nadie se moleste en poner 0 en un convertidor ya que la respuesta es obvia, pero elija la solución que prefiera. Una instrucción if en la parte superior del script junto con sys.exit o verificar el valor de la variable de solución en la parte inferior. –

4

Usar una tabla de búsqueda, como:

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

then prin t Cada cuarteto como esto

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

Sin duda, se puede utilizar una sola mesa, pero será ligeramente más rápido y demasiado grande.

22

Basado en dirkgently's answer, pero la fijación de sus dos errores, y siempre la impresión de un número fijo de dígitos:

void printbits(unsigned char v) { 
    int i; // for C89 compatability 
    for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1)); 
} 
+1

Como guinda del pastel, también podrías reemplazar i = 7 con (sizeof (v) * 8) -1 –

+0

Haría eso si pudiera encontrar una manera de hacer que la función tome un argumento de cualquier tipo, en lugar de solo un char sin signo. Intenté usar un puntero de vacío, pero recibo errores. Sin embargo, tendré que investigar eso más en algún momento. –

+0

esto funcionó para mí: char * printbits (int v) { for (int i = (sizeof (v) * 8) -1; i> = 0; i--) putchar ('0' + ((v >> i) & 1)); } –

3

Este código debe manejar sus necesidades de hasta 64 bits.



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 
5
#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; 
} 
Cuestiones relacionadas