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

Der obige Code gibt ein int x in roher Binärdatei aus, aber nur 1 Byte. was ich brauche es die x als 4 Bytes binär zu tun ausgegeben wird, weil in meinem Code, x zwischen 0 und 2^32-1, daWie ein int in binär ausgeben?

nicht tut den Trick sein kann, Wie würde ich es tun?

+2

Was macht es? Er postete, was er bisher versucht hatte und warum sein Code nicht funktionierte und stellte eine klare Frage. –

+0

Das ist nicht gut mit 'Cout', weil Sie nicht kontrollieren können, wie es geöffnet ist. Wenn Sie eine binäre Ausgabe ausführen möchten, öffnen Sie Ihren eigenen Stream und fügen Sie das Flag "ios_base :: binary" in Ihr Argument "openmmode" ein. –

Antwort

9

können Sie die Funktion std::ostream::write() Mitglied verwenden:

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

Beachten Sie, dass dies in der Regel mit einem Strom wollen würde, tun, die im Binärmodus geöffnet wurde.

+0

ok, das werde ich mir merken, danke! – user299648

2

Versuchen:

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

Hinweis: Das Schriftfelter Daten im Binärformat ist nicht tragbar.
Wenn Sie es auf einer alternativen Maschine lesen möchten, müssen Sie entweder die gleiche Architektur haben oder Sie müssen das Format standardisieren und sicherstellen, dass alle Maschinen das Standardformat verwenden.

Wenn Sie binäre der einfachste Weg, schreiben möchten, das Format zu standardisieren, Daten zu Netzwerk-Format zu konvertieren (es gibt eine Reihe von Funktionen für die htonl() < -> ntohl() usw.)

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

Aber das transportierbarste Format ist, nur in Text zu konvertieren.

std::cout << x; 
1

Ein paar Hinweise.

Erstens, um zwischen 0 und 2^32 - 1 zu sein, benötigen Sie eine unsigned vier Byte Int.

Zweitens haben die vier Bytes beginnend bei der Adresse von x (& x) bereits die gewünschten Bytes.

Hilft das?

2

und was ist das?

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

+0

Sehr wahrscheinlich ist dies mehr auf der richtigen Spur als die anderen Antworten - die ursprüngliche Frage spezifiziert nicht "binär schreiben" * wie *. Wenn es "aber zufällig im Speicher" ist, ist das eine Sache, aber wenn Sie versuchen, mit irgendetwas anderem kompatibel zu sein, dann möchten Sie vielleicht (zum Beispiel) immer eine 32 Bit lange Netzwerk-Byte-Reihenfolge schreiben, wie diese Antwort (modulo einige Kompatibilitätsprobleme) – hobbs

24

Ein bisschen spät, aber, wie Katy in ihrem Blog zeigt, könnte dies eine elegante Lösung sein:

#include <bitset> 
#include <iostream> 

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

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

+4

Wahrscheinlich die vernünftigste Antwort.Es wird davon ausgegangen, dass wir über einen 32-Bit-Int sprechen, aber wir machen solche Annahmen in fast jeder anderen Antwort. – v010dya

+4

@ v010dya Sie können etwas wie std :: bitset (oder std :: bitset ) tun, um diese Annahmen zu vermeiden. – Conchylicultor

+0

Ich denke, es ist wichtig zu beachten, dass diese Antwort die Frage nicht beantwortet. – Tkdestroyer2