Wie kann man ein Bit setzen, löschen und umschalten?
Rückgabetyp von check_nth_bit
kann sein bool
.
Wie kann man ein Bit setzen, löschen und umschalten?
Wenn Sie diese ganze Operation mit C-Programmierung in der Linux-Kernel dann empfehle ich, die Standard-APIs des Linux-Kernels zu verwenden.
Véase https://www.kernel.org/doc/htmldocs/kernel-api/ch02s03.html
set_bit Atomically set a bit in memory
clear_bit Clears a bit in memory
change_bit Toggle a bit in memory
test_and_set_bit Set a bit and return its old value
test_and_clear_bit Clear a bit and return its old value
test_and_change_bit Change a bit and return its old value
test_bit Determine whether a bit is set
Hinweis: Hier erfolgt der gesamte Vorgang in einem einzigen Schritt. So sind diese alle garantiert atomar auch auf SMP-Computern und sind nützlich um die Kohärenz zwischen den Prozessoren aufrechtzuerhalten.
Visual C 2010 und vielleicht auch viele andere Compiler haben direkte Unterstützung für boolesche Operationen eingebaut. Ein Bit hat zwei mögliche Werte, genau wie ein Boolescher Wert, so dass wir stattdessen Boolesche Werte verwenden können - auch wenn sie in dieser Darstellung mehr Platz im Speicher benötigen als ein einzelnes Bit. Das funktioniert, auch wenn die sizeof()
ordnungsgemäß funktioniert.
bool IsGph[256], IsNotGph[256];
// Initialize boolean array to detect printable characters
for(i=0; i<sizeof(IsGph); i++) {
IsGph[i] = isgraph((unsigned char)i);
}
Also, zu Ihrer Frage, IsGph[i] =1
o IsGph[i] =0
machen das Setzen und Löschen von Bools einfach.
Um nicht druckbare Zeichen zu finden:
// Initialize boolean array to detect UN-printable characters,
// then call function to toggle required bits true, while initializing a 2nd
// boolean array as the complement of the 1st.
for(i=0; i<sizeof(IsGph); i++) {
if(IsGph[i]) {
IsNotGph[i] = 0;
} else {
IsNotGph[i] = 1;
}
}
An diesem Code ist nichts "Besonderes". Er behandelt ein Bit wie eine ganze Zahl - was es technisch gesehen auch ist. Eine 1-Bit-Ganzzahl, die 2 Werte enthalten kann, und nur 2 Werte.
Ich habe diesen Ansatz einmal verwendet, um doppelte Darlehensdatensätze zu finden, wobei loan_number der ISAM-Schlüssel war und die 6-stellige Darlehensnummer als Index in das Bit-Array verwendet wurde. Das ging rasend schnell, und nach 8 Monaten war bewiesen, dass das Großrechnersystem, von dem wir die Daten bezogen, tatsächlich eine Fehlfunktion hatte. Aufgrund der Einfachheit von Bit-Arrays ist das Vertrauen in ihre Korrektheit sehr hoch - zum Beispiel im Vergleich zu einem Suchansatz.
Die Erweiterung der bitset
Antwort:
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main() {
bitset<8> byte(std::string("10010011");
// Set Bit
byte.set(3); // 10010111
// Clear Bit
byte.reset(2); // 10010101
// Toggle Bit
byte.flip(7); // 00010101
cout << byte << endl;
return 0;
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
90 Stimmen
Lesen Sie dies: graphics.stanford.edu/~seander/bithacks.html und, wenn du das gemeistert hast, lies das hier: realtimecollisiondetection.net/blog/?p=78
22 Stimmen
Das könnte Sie auch interessieren Der Gebissverdreher , Bit Twiddling Hacks und Die Aggregat-Magie-Algorithmen .
0 Stimmen
Das wirft die Frage auf, was die kanonische Frage für mehrere Bits ist.
2 Stimmen
Verwandt: Was sind bitweise Verschiebungsoperatoren (Bit-Shift) und wie funktionieren sie?
2 Stimmen
Einige Kandidaten: Ersetzen von Bits in einem Bitfeld ohne Auswirkungen auf andere Bits mit C (2011), und Wie kann man in C nur bestimmte Bits eines Bytes setzen, ohne den Rest zu beeinflussen? (2010)