Ich absolviere einen College-Kurs über Betriebssysteme und wir lernen, wie man von binär zu hexadezimal, dezimal zu hexadezimal usw. konvertiert. Heute haben wir gerade gelernt, wie vorzeichenbehaftete / vorzeichenlose Zahlen unter Verwendung des Zweierkomplements (~ number) im Speicher gespeichert werden + 1).
Wir haben ein paar Übungen auf Papier zu machen und ich möchte meine Antworten überprüfen können, bevor ich meine Arbeit dem Lehrer vorlege. Ich habe ein C ++ - Programm für die ersten Übungen geschrieben, aber jetzt bin ich nicht sicher, wie ich meine Antwort mit dem folgenden Problem überprüfen kann:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
und wir müssen die binäre Darstellung zeigen , in dem Speicher von a
, b
und c
.
Ich habe es auf Papier gemacht und es gibt mir die folgenden Ergebnisse (alle binären Darstellungen im Speicher der Zahlen nach dem Komplement der beiden):
a = 00111010 (es ist ein Zeichen, also 1 Byte)
b = 00001000 (es ist ein Zeichen, also 1 Byte)
c = 11111110 11000101 (es ist kurz, also 2 Bytes)
Gibt es eine Möglichkeit, meine Antwort zu überprüfen? Gibt es in C ++ eine Standardmethode, um die binäre Darstellung im Speicher einer Zahl anzuzeigen, oder muss ich jeden Schritt selbst codieren (das Komplement der beiden berechnen und dann in binär konvertieren)? Ich weiß, dass Letzteres nicht so lange dauern würde, aber ich bin gespannt, ob es einen Standardweg gibt.
quelle
std::hex
) Manipulator drucken - ich überlasse es Ihnen als Übung, den RestAntworten:
Der einfachste Weg ist wahrscheinlich, eine
std::bitset
Darstellung des Werts zu erstellen und diese dann zu streamencout
.quelle
std::bitset
!+1
von mir.bitset
Konstruktorargument von @Jesse: wird als vorzeichenloser Wert interpretiert, der dem Zweierkomplement entspricht. Genau genommen garantiert C ++ keine Zweierkomplementarithmetik, und auch die-58 >> 3
Operation in Ihrem Beispiel ist undefiniert.Verwenden Sie die On-the-Fly-Konvertierung zu
std::bitset
. Keine temporären Variablen, keine Schleifen, keine Funktionen, keine Makros.Live On Coliru
Drucke:
quelle
x
verwenden :std::cout << std::bitset<8*sizeof(x)>(x)
.Wenn Sie die Bitdarstellung eines Objekts anzeigen möchten, nicht nur eine Ganzzahl, denken Sie daran, diese zuerst als Zeichenarray neu zu interpretieren. Anschließend können Sie den Inhalt dieses Arrays als Hex oder sogar als Binärdatei (über Bitset) drucken:
Beachten Sie, dass die meisten gängigen Systeme sind Little-Endian, so dass der Ausgang
show_binrep(c)
ist nicht der 1111111 011000101 Sie erwarten, weil das nicht ist , wie es im Speicher gespeichert ist. Wenn Sie nach einer Wertedarstellung in Binärform suchen ,cout << bitset<16>(c)
funktioniert eine einfache .quelle
Nein, es gibt kein
std::bin
, wiestd::hex
oderstd::dec
, aber es ist nicht schwer, selbst eine Binärzahl auszugeben:Sie geben das Bit ganz links aus, indem Sie alle anderen maskieren, nach links verschieben und dies für alle vorhandenen Bits wiederholen.
(Die Anzahl der Bits in einem Typ beträgt
sizeof(T) * CHAR_BIT
.)quelle
Ähnlich wie bereits veröffentlicht, nur Bitverschiebung und Maske verwenden, um das Bit zu erhalten. Als Vorlage verwendbar für jeden Typ (
nur nicht sicher, ob es einen Standardweg gibt, um die Anzahl der Bits in 1 Byte zu ermitteln, habe ich hier 8 verwendet).quelle
CHAR_BIT
.Wiederverwendbare Funktion:
Verwendung:
Dies funktioniert mit allen Arten von ganzen Zahlen.
quelle
quelle
int t = pow(2, num_of_bits - 1);
?Mit der alten C ++ - Version können Sie dieses Snippet verwenden:
quelle
Verwenden der std :: bitset-Antworten und Convenience-Vorlagen:
Verwenden Sie es so:
Erzeugt Ausgabe:
quelle
Hier ist der wahre Weg, um eine binäre Darstellung einer Zahl zu erhalten:
quelle
Ist es das, wonach du suchst?
quelle
</argument>
. Wirklich, wir sind Erwachsene, ja? Ich habe fast das Alter aller Kommentare überprüft, um sicherzustellen, dass alle über 13 Jahre alt waren.