Ich muss mit einer Binärzahl arbeiten.
Ich habe versucht zu schreiben:
const x = 00010000;
Aber es hat nicht funktioniert.
Ich weiß, dass ich eine Hexadezimalzahl verwenden kann, die denselben Wert hat wie 00010000
, aber ich möchte wissen, ob es in C ++ einen Typ für Binärzahlen gibt, und wenn nicht, gibt es eine andere Lösung für mein Problem?
00010000
das oktal ist, richtig? (Und Ihrer Erklärung fehlt ein Typ.)0b
erscheint nur in C ++ 14). Sie sind so konzipiert, dass sie eindeutig sind.Antworten:
Sie können verwenden,
BOOST_BINARY
während Sie auf C ++ 0x warten. :) hatBOOST_BINARY
wohl einen Vorteil gegenüber der Template-Implementierung, da es auch in C-Programmen verwendet werden kann (es ist 100% präprozessorgesteuert.)Um das Gegenteil zu tun (dh eine Zahl in binärer Form auszudrucken), können Sie die nicht portierbare
itoa
Funktion verwenden oder Ihre eigene implementieren .Leider können Sie die Basis 2-Formatierung nicht mit STL-Streams durchführen (da
setbase
nur die Basen 8, 10 und 16 berücksichtigt werden), aber Sie können entweder einestd::string
Version vonitoa
oder (die prägnantere, aber geringfügig weniger effiziente) verwendenstd::bitset
.produziert:
Lesen Sie auch Herb Sutters The String Formatters of Manor Farm für eine interessante Diskussion.
quelle
int main() { cout << bitset<8>(42); }
bitset
Tipp, ich habe das bisschen schon korrigiert,setbase
bevor ich deinen Kommentar gesehen habe.Wenn Sie GCC verwenden, können Sie hierfür eine GCC-Erweiterung (die im C ++ 14-Standard enthalten ist ) verwenden:
quelle
Sie können binäre Literale verwenden. Sie sind in C ++ 14 standardisiert. Beispielsweise,
Unterstützung im GCC
Die Unterstützung in GCC begann in GCC 4.3 (siehe https://gcc.gnu.org/gcc-4.3/changes.html ) als Erweiterung der C-Sprachfamilie (siehe https://gcc.gnu.org/onlinedocs/gcc/). C-Extensions.html # C-Extensions ), aber seit GCC 4.9 wird es jetzt entweder als C ++ 14-Feature oder als Erweiterung erkannt (siehe Unterschied zwischen GCC-Binärliteralen und C ++ 14-Literalen? )
Unterstützung in Visual Studio
Die Unterstützung in Visual Studio wurde in der Visual Studio 2015-Vorschau gestartet (siehe https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
quelle
Die Ziffer ganz links im Literal muss immer noch 1 sein, aber trotzdem.
quelle
binary<10>::value == binary<010>::value
und einige Fehlerprüfungen)Einige Compiler (normalerweise die für Mikrocontroller ) verfügen über eine spezielle Funktion, die beim Erkennen von wörtlichen Binärzahlen durch das Präfix "0b ..." vor der Nummer implementiert ist , obwohl die meisten Compiler (C / C ++ - Standards) diese Funktion nicht haben und wenn ja ist der Fall, hier ist es meine alternative Lösung:
Nachteile (es ist nicht so groß):
Vorteile :
spending processor time
in sinnlosen Operationen (like "?.. :..", "<<", "+"
) zum ausführbaren Programm (es kann in der endgültigen Anwendung hundertmal ausgeführt werden);"mainly in C"
Compilern und C ++ (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
"wörtlich konstanten" Beschränkungen der Compiler größere Zahlen zulässt;several header files
(in den meisten Fällen nicht leicht lesbarer und verständlicher), und führen dazu, dass das Projekt unnötig verwirrt und erweitert wird, wie dies bei der Verwendung der Fall ist"BOOST_BINARY()"
).quelle
B_0100
nicht verwendet (statt0100
)? Wie in zchar b = BYTE(0100,0001);
._B2H
Präprozessorfunktion hinzugefügt .Dieser Thread kann helfen.
Es klappt! (Alle Credits gehen an Tom Torfs.)
quelle
##
Präprozessor-Operator fügt Token zusammen. Wenn Sie in diesem Fall anrufenHEX__(10)
, wird es auf erweitert0x10LU
.Wie bereits beantwortet, haben die C-Standards keine Möglichkeit, Binärzahlen direkt zu schreiben. Es gibt jedoch Compiler-Erweiterungen, und anscheinend enthält C ++ 14 das
0b
Präfix für Binär. (Beachten Sie, dass diese Antwort ursprünglich im Jahr 2010 veröffentlicht wurde.)Eine beliebte Problemumgehung besteht darin, eine Header-Datei mit Hilfsmakros einzuschließen . Eine einfache Option besteht auch darin, eine Datei zu generieren, die Makrodefinitionen für alle 8-Bit-Muster enthält, z.
Dies führt zu nur 256
#define
s, und wenn größere als 8-Bit-Binärkonstanten benötigt werden, können diese Definitionen mit Verschiebungen und ODERs kombiniert werden, möglicherweise mit Hilfsmakros (z.BIN16(B00000001,B00001010)
. ). (Einzelne Makros für jeden 16-Bit-, geschweige denn 32-Bit-Wert sind nicht plausibel.)Der Nachteil ist natürlich, dass für diese Syntax alle führenden Nullen geschrieben werden müssen. Dies kann jedoch auch für Verwendungszwecke wie das Setzen von Bitflags und den Inhalt von Hardwareregistern klarer werden. Ein funktionsähnliches Makro, das zu einer Syntax ohne diese Eigenschaft führt, finden Sie
bithacks.h
oben verlinkt.quelle
long long int
?Die C ++ - Über-Engineering-Denkweise ist in den anderen Antworten hier bereits gut berücksichtigt. Hier ist mein Versuch, dies mit einer C-Denkweise zu tun: Keep-it-simple-ffs:
quelle
C hat keine native Notation für reine Binärzahlen. Ihre beste Wette hier wäre entweder Oktal (zB
07777
) oder Hexadezimal (zB0xfff
).quelle
Mit der in dieser Frage enthaltenen Funktion können Sie in C ++ bis zu 22 Bit abrufen. Hier ist der Code aus dem Link, entsprechend bearbeitet:
Sie können also so etwas tun
binary<0101011011>::value
.quelle
Die kleinste Einheit, mit der Sie arbeiten können, ist ein Byte (vom
char
Typ). Sie können jedoch mit Bits arbeiten, indem Sie bitweise Operatoren verwenden.Bei ganzzahligen Literalen können Sie nur mit Dezimalzahlen (Basis 10), Oktalzahlen (Basis 8) oder Hexadezimalzahlen (Basis 16) arbeiten. In C und C ++ gibt es keine binären (Basis 2) Literale.
Oktalzahlen wird ein Präfix
0
und Hexadezimalzahlen ein Präfix vorangestellt0x
. Dezimalzahlen haben kein Präfix.In C ++ 0x können Sie übrigens über benutzerdefinierte Literale tun, was Sie wollen .
quelle
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
. SDCC ist eines davon, und ich bin sicher, dass es auch andere gibt, die dies tun. (Edit: Hah, schlag mich, @Joey!)Sie können die Inline-Baugruppe auch folgendermaßen verwenden:
Okay, es könnte etwas übertrieben sein, aber es funktioniert.
quelle
Basierend auf einigen anderen Antworten, aber diese wird Programme mit illegalen binären Literalen ablehnen. Führende Nullen sind optional.
Beispiel:
quelle
Der "Typ" einer Binärzahl ist der gleiche wie jede Dezimal-, Hex- oder Oktalzahl:
int
(oder sogar char, kurz, lang, lang).Wenn Sie eine Konstante zuweisen, können Sie sie nicht mit 11011011 zuweisen (seltsamerweise und leider), aber Sie können hex verwenden. Hex ist etwas einfacher mental zu übersetzen. Chunk in Nibbles (4 Bit) und in ein Zeichen in [0-9a-f] übersetzen.
quelle
Sie können ein Bitset verwenden
quelle
Ich habe die gute Antwort von @ renato-chandelier erweitert, indem ich die Unterstützung von:
_NIBBLE_(…)
- 4 Bits, 1 Halbbyte als Argument_BYTE_(…)
- 8 Bits, 2 Halbbytes als Argumente_SLAB_(…)
- 12 Bit, 3 Halbbytes als Argumente_WORD_(…)
- 16 Bit, 4 Halbbytes als Argumente_QUINTIBBLE_(…)
- 20 Bits, 5 Knabbereien als Argumente_DSLAB_(…)
- 24 Bit, 6 Halbbytes als Argumente_SEPTIBBLE_(…)
- 28 Bit, 7 Halbbytes als Argumente_DWORD_(…)
- 32 Bit, 8 Halbbytes als ArgumenteBei den Begriffen „Quintibble“ und „Septibble“ bin ich mir eigentlich nicht so sicher. Wenn jemand eine Alternative kennt, lass es mich wissen.
Hier ist das Makro umgeschrieben:
Und hier ist Renatos Beispiel:
quelle
Verwenden Sie einfach die Standardbibliothek in C ++:
Sie benötigen eine Variable vom Typ
std::bitset
:In diesem Beispiel habe ich die Binärform von
10
in gespeichertx
.8ul
Definiert die Größe Ihrer Bits,7ul
bedeutet also sieben Bits und so weiter.quelle
C ++ bietet eine Standardvorlage mit dem Namen
std::bitset
. Probieren Sie es aus, wenn Sie möchten.quelle
Sie könnten versuchen, ein Array von
bool
:quelle