int temp = 0x5E; // in binary 0b1011110.
Gibt es eine Möglichkeit zu überprüfen, ob Bit 3 in Temp 1 oder 0 ist, ohne dass Bit verschoben und maskiert wird?
Ich möchte nur wissen, ob es dafür eine eingebaute Funktion gibt, oder bin ich gezwungen, selbst eine zu schreiben.
c++
c
bit-manipulation
Mailand
quelle
quelle
!= 0
wahr, warum also die Mühe machen?1
ist genau so wahr wie0.1415
!std::bitset
, wirklich? Sicher, anstatt ein bisschen Arbeit (und möglicherweise einige wirklich nette Vorlagen) zu erledigen, um ein einzelnes Bit zu überprüfen, verwenden Sie einen aufgeblähten Container, der (bei meiner Implementierung) jedes 'Bit' in einem ansonsten nicht verwendeten Bit speichertunsigned long
. Was für eine Platzverschwendung!Überprüfen Sie, ob Bit N (ab 0) gesetzt ist:
Hierfür gibt es keine eingebaute Funktion.
quelle
1 << 0
? Entschuldigung, verwirrt.1<<0
1 ohne Schicht (Schicht 0), also1<<0 == 1
Ich würde nur ein std :: bitset verwenden, wenn es C ++ ist. Einfach. Einfach. Keine Chance für dumme Fehler.
oder wie wäre es mit dieser Albernheit
quelle
std::bitset<CHAR_BIT * sizeof(int)>
um noch korrekter zu seinJa, ich weiß , ich weiß nicht „haben“ es auf diese Weise zu tun. Aber ich schreibe normalerweise:
Z.B:
Dieser Ansatz ist unter anderem:
ZB: # ABS (X) definieren (((X) <0) - (X): (X))
ABS (i ++);
quelle
Was die ausgewählte Antwort tut, ist tatsächlich falsch. Die folgende Funktion gibt die Bitposition oder 0 zurück, je nachdem, ob das Bit tatsächlich aktiviert ist. Dies ist nicht das, wonach das Poster gefragt hat.
Hier ist, wonach das Poster ursprünglich gesucht hat. Die folgende Funktion gibt entweder eine 1 oder eine 0 zurück, wenn das Bit aktiviert ist und nicht die Position.
quelle
bool has_feature = CHECK_BIT(register, 25);
bin, als ich es verwendet habe. Gut zu wissen, dass ich es ohne das doppelte Negieren tun kann.Nach dieser Beschreibung von Bitfeldern gibt es eine Methode zum direkten Definieren und Zugreifen auf Felder. Das Beispiel in diesem Eintrag lautet:
Außerdem gibt es dort eine Warnung:
quelle
Sie können ein Bitset verwenden - http://www.cppreference.com/wiki/stl/bitset/start .
quelle
Verwenden Sie std :: bitset
quelle
temp
nicht reflektiert werden, um ihn zu einem "Big-Endian" zu machen?Es gibt nämlich die kleinste intrinsische Anweisung.
quelle
Ich benutze das:
wobei "pos" definiert ist als 2 ^ n (ig 1,2,4,8,16,32 ...)
Rückgabe: 1 wenn wahr 0 wenn falsch
quelle
4 = 2^(3-1)
für Bitposition 3 verwendet werden soll, da dies Teil der Frage war.Ich habe versucht, eine 32-Bit-Ganzzahl zu lesen, die die Flags für ein Objekt in PDFs definiert, und das hat bei mir nicht funktioniert
Was behoben wurde, war die Änderung der Definition:
Der Operand & gibt eine Ganzzahl mit den Flags zurück, die beide in 1 haben, und es wurde nicht richtig in Boolesche Werte umgewandelt. Dies hat den Trick getan
quelle
!= 0
würde das gleiche tun. Sie wissen nicht, wie sich die generierten Maschinenanweisungen unterscheiden können.Sie können das Verschieben und Maskieren "simulieren": if ((0x5e / (2 * 2 * 2))% 2) ...
quelle
Verwenden Sie für die Low-Level-x86-spezifische Lösung den x86- TEST- Opcode.
Ihr Compiler sollte _bittest jedoch in dieses verwandeln ...
quelle
Warum nicht so etwas Einfaches verwenden?
AUSGABE: binär:
11111111
quelle
std::cout << (((status & (1 << i)) ? '1' : '0');
. Sie sollten dieCHAR_BIT
Konstante von<climits>
anstelle von 8-Bit-Codierung verwenden, obwohl Sie in diesem Fall wissen, dass das Ergebnis ohnehin 8 ist, da Sie eineuint8_t
Wenn Sie nur einen wirklich hartcodierten Weg wollen:
Beachten Sie, dass dies hw-abhängig ist und diese Bitreihenfolge 7654 3210 annimmt und var 8 Bit ist.
Ergebnisse in:
1 0 1 0
quelle
Obwohl es ziemlich spät ist, jetzt zu antworten, gibt es eine einfache Möglichkeit, herauszufinden, ob das N-te Bit gesetzt ist oder nicht, indem einfach die mathematischen Operatoren POWER und MODULUS verwendet werden.
Nehmen wir an, wir möchten wissen, ob für 'temp' das N-te Bit gesetzt ist oder nicht. Der folgende boolesche Ausdruck gibt true, wenn das Bit gesetzt ist, andernfalls 0.
Betrachten Sie das folgende Beispiel:
Wenn ich wissen will, ob das 3. Bit gesetzt ist oder nicht, bekomme ich
Der Ausdruck gibt also true zurück und zeigt an, dass das 3. Bit gesetzt ist.
quelle
Ein Ansatz besteht darin, unter folgenden Bedingungen zu prüfen:
Ein Erklärungsprogramm wird sein:
Ausgabe:
quelle
pos - Bitposition ab 0.
gibt 0 oder 1 zurück.
quelle
Ich mache das:
LATGbits.LATG0 = ((m & 0x8)> 0); // um zu überprüfen, ob Bit-2 von m 1 ist
quelle
Der schnellste Weg scheint eine Nachschlagetabelle für Masken zu sein
quelle