3165 Stimmen

Wie kann man ein einzelnes Bit setzen, löschen und umschalten?

Wie kann man ein Bit setzen, löschen und umschalten?

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.

12voto

Verwenden Sie dies:

int ToggleNthBit ( unsigned char n, int num )
{
    if(num & (1 << n))
        num &= ~(1 << n);
    else
        num |= (1 << n);

    return num;
}

12voto

Jeegar Patel Punkte 24720

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.

11voto

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.

11voto

kendotwill Punkte 1582

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;
}

6voto

Sazzad Hissain Khan Punkte 33230
int set_nth_bit(int num, int n){    
    return (num | 1 << n);
}

int clear_nth_bit(int num, int n){    
    return (num & ~( 1 << n));
}

int toggle_nth_bit(int num, int n){    
    return num ^ (1 << n);
}

int check_nth_bit(int num, int n){    
    return num & (1 << n);
}

1 Stimmen

Rückgabetyp von check_nth_bit kann sein bool .

1 Stimmen

@Xeverous ja, es hängt von der Absicht des Anrufers ab

CodeJaeger.com

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.

Powered by:

X