2008-12-08 17 views
6

Por favor dígame cómo imprimo un bit, como printf("%d",bit);.¿Cómo imprimo un bit?

+0

Esta es una buena pregunta que necesita reformularse, pero todavía no tengo privilegios de edición .... –

Respuesta

19

Si el bit es sólo un int que contiene el valor que desee en el bit menos significativo, entonces:

printf("%d", bit & 0x1); 

debe hacerlo. El & está haciendo un Binario-Y con un número con solo el primer bit significativo establecido, por lo que está eliminando el resto de los bits en el entero.

+0

Tenga en cuenta que la extracción de un bit desde un número de múltiples bytes te hace toparse con problemas de endianess. – gnud

+4

@gnud: Eso solo se aplica cuando se realiza en memoria, usando punteros. Bit & 0x1 siempre funcionará, independientemente de la forma en que el valor se almacena en la memoria. – unwind

3

Para imprimir el bit de orden m (m 1..16 o 32) de n:

void print_bit(n, m) 
{ 
    printf("%d", n & (1 << (m - 1))); 
} 

extraer la broca - 1 si su contador de bits comienza en 0.

+0

Eso no funcionará del todo. Estás enmascarando el bit que quieres, pero estás dejando ese bit en su lugar, por lo que no obtendrás 1 o 0. Para obtener siempre 1 o 0 para ese bit necesitarías cambiar la variable a la derecha, no cambiar la máscara izquierda. – Herms

+0

Correcto, lo perdí, gracias. – Keltia

+1

¿Qué tiene de malo tu función? Y "n" no se usa. ¿Quiso decir printf ("% d", n & (1 << (m - 1))? – Koshmaar

9

Si necesita generalizar más de Herms, usted puede hacer esto:

#define IsBitSet(val, bit) ((val) & (1 << (bit))) 

/* ... your code ... */ 

printf ("%c", IsBitSet(bit, 0) ? '1' : '0'); 

El printf es equivalente a la respuesta Herms como es.

Si estás hablando de campo de bits en C, usted puede hacer esto: pregunta

struct foo { int b:1; } myFoo; 

printf("%c", myFoo.b ? '1' : '0'); 
+0

Falta un paréntesis de cierre al final de la definición de la macro, no? – bortzmeyer

+0

buena captura - se corrigió – plinth

+1

Esto parece una rotonda pequeña - ¿por qué no '((val) >> (bit)) & 0x1' para que pueda imprimirlo como un número entero en vez del ternario? –

1

respuesta El C++ es más fácil que el C89 uno, con el tipo bool orígenes:

bool b = true; 
std::cout << b; 

C99 es bastante similar:

_Bool b = 1; 
printf("%d", b); 
+0

Bools generalmente no son de un tamaño. –

1

puede utilizar "unión":

union bitshow { 
    unsigned bit1:1; 
    int i; 
}; 

int main() { 
    union bitshow bit; 
    cin >> bit.i; 
    cout << bit.bit1; 
    return 0; 
} 
+3

¿Imprimiría eso el más significativo? poco, bit menos significativo, o algo más? No puede saber, porque no es portátil. – interjay

Cuestiones relacionadas