2010-07-17 5 views
11
int x = 5; 
cout<<(char)x; 

el código de arriba muestra un int x en binario en bruto, pero solo 1 byte. lo que necesito que haga es la salida x como 4 bytes en binario, ya que en mi código, x puede estar en cualquier lugar entre 0 y 2^32-1, ya quecómo generar un int en binario?

no hacer el truco, ¿cómo lo haría?

+2

¿Qué importa? Publicó lo que intentaba hacer hasta ahora y por qué su código no funcionaba y formuló una pregunta clara. –

+0

No es probable que funcione bien con 'cout', porque no tienes control sobre cómo se abre. Si quieres hacer una salida binaria, abre tu propia transmisión e incluye el indicador 'ios_base :: binary' en tu argumento' openmmode'. –

Respuesta

9

Usted puede utilizar la función de miembro de std::ostream::write():

std::cout.write(reinterpret_cast<const char*>(&x), sizeof x); 

Tenga en cuenta que normalmente querrá hacer esto con una corriente que se ha abierto en modo binario.

+0

bien, lo tendré en cuenta, ¡gracias! – user299648

2

Probar:

int x = 5; 
std::cout.write(reinterpret_cast<const char*>(&x),sizeof(x)); 

Nota: Que los datos de la escritura en formato binario es no portátil.
Si desea leerlo en una máquina alternativa, necesita tener exactamente la misma arquitectura o necesita estandarizar el formato y asegurarse de que todas las máquinas usen el formato estándar.

Si desea escribir binario de la manera más fácil de estandarizar el formato es convertir los datos al formato de red (hay un conjunto de funciones para que htonl() < -> ntohl(), etc)

int x = 5; 
u_long transport = htonl(x); 
std::cout.write(reinterpret_cast<const char*>(&transport), sizeof(u_long)); 

Pero el formato más transportable es simplemente convertir a texto.

std::cout << x; 
1

Un par de consejos.

En primer lugar, para estar entre 0 y 2^32 - 1 necesitarás un sin signo de cuatro bytes int.

En segundo lugar, los cuatro bytes que comienzan en la dirección de x (& x) ya tienen los bytes que desea.

¿Eso ayuda?

2

y ¿qué tal esto?

 
int x = 5; 
cout<<(char) ((0xff000000 & x) >> 24); 
cout<<(char) ((0x00ff0000 & x) >> 16); 
cout<<(char) ((0x0000ff00 & x) >> 8); 
cout<<(char) (0x000000ff & x); 

+0

Muy posiblemente esto esté más en el camino correcto que las otras respuestas; la pregunta original no especifica "escribir en binario" * cómo *. Si es "como quiera que esté en la memoria", eso es una cosa, pero si intentas ser compatible con cualquier otra cosa, entonces podrías (por ejemplo) escribir siempre una longitud de 32 bits en orden de bytes de red, como lo hace esta respuesta (algunos problemas de compatibilidad) – hobbs

24

Un poco tarde, pero, como se muestra Katy en su blog, esto podría ser una solución elegante:

#include <bitset> 
#include <iostream> 

int main(){ 
    int x=5; 
    std::cout<<std::bitset<32>(x)<<std::endl; 
} 

tomado de: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

+4

Probablemente la respuesta más razonable.De alguna manera supone que estamos hablando de un int de 32 bits, pero también estamos haciendo suposiciones en casi todas las demás respuestas. – v010dya

+4

@ v010dya Puede hacer algo como std :: bitset (o std :: bitset ) para evitar esas suposiciones. – Conchylicultor

+0

Creo que es importante tener en cuenta que esta respuesta no responde a la pregunta. – Tkdestroyer2