Strona główna » Algorytmy » Artykuły » Edytowanie Bitów
 

Edytowanie Bitów

Cel

Operacje bitowe to podstawowe operacje wykonywane przez komputer. Zastosowanie ich pozwala na pisanie efektywnie działających algorytmów. Oto kilka przykładowych metod jak można edytować jeden konkretny bit.

Implementacja

Odczyt bitu

Chcemy odczytać bit z konkretnej pozycji p. W tym celu przesuwamy o p bitów w prawo. Następnie robimy koniunkcję z wartością 1. Dzięki temu zostanie pobrany najmniej znaczący bit. Metodę tę wykorzystamy później do wypisania liczby w zapisie binarnym.

Przykładowo mamy 13 = 11012. Chcemy odczytać trzeci bit od prawej. Przesuwamy bity o dwa w prawo 11012 >> 2 = 112. Następnie robimy koniunkcję 112 i 012 i uzyskujemy 1.

C++
C#
  1. int OdczytajBit(int a, int pozycja) {
  2.   return (a >> pozycja) & 1;
  3. }

Czyszczenie bitu

W celu wyczyszczenia bitu tj. ustawienia go do wartości 0 zastosujemy operator AND. Najpierw przygotywujemy maskę, która na tej jednej konkretnej pozycji będzie mieć wartość, a na pozostałych 1. Wtedy operacja AND maski i przekazanej liczby ustawi 0 dokładnie tam, gdzie 0 jest w masce, a pozostałe bity nie zostaną zmienione.

Przykładowo mamy 13 = 11012. Chcemy wyczyścić trzeci bit od prawej. W tym celu budujemy maskę poprzez przesunięcie 1 o 2 pozycje w lewo uzyskując 1002. Następnie negujemy zawartość zmiennej. Przyjmując, że liczbe przechowujemy w 4 bitowej zmiennej to uzyskamy wartość 10112. Teraz wykonujemy koniunkcję 11012 i 10112. Wynik to 10012 czyli 9.

C++
C#
  1. int WyczyscBit(int a, int pozycja) {
  2.   int maska = ~(1 << pozycja);
  3.   return maska & a;
  4. }

Ustawianie bitu

Najprostszym sposobem na ustawienie konkretnego bitu jest wpierw jego wyczyszczenie, a następnie wykonanie operacji OR liczby i odpowiedniej maski. Maska będzie tworzona poprzez przesunięcie 1 na odpowiednią pozycję.

Przykładowo mamy 13 = 11012. Chcemy ustawić drugi bit od prawej. Czyściemy drugi bit od prawej. W tym przypadku nie ma to efektu. Teraz budujemy maskę przesuwając 1 o jedną pozycję w lewo. Teraz wykonujemy 11012 OR 00102 i uzyskujemy 11112.

C++
C#
  1. int UstawBit(int a, int pozycja) {
  2.   a = WyczyscBit(a, pozycja);
  3.   return a | (1 << pozycja);
  4. }

Testowanie funkcji

Do przetestowania kodu~można skorzystać z poniższego fragmentu kodu, który ma na stałe wpisane opisane wcześniej wykonywane operacje.

C++
C#
  1. void WypiszLiczbe(int a) {
  2.   cout << a << "\t";
  3.   for (int i = 4; i >= 0; i--) {
  4.     cout << OdczytajBit(a, i);
  5.   }
  6.   cout << endl;
  7. }
  8. int main() {
  9.   int a = 13;
  10.   WypiszLiczbe(a); // 01101_2
  11.   a = WyczyscBit(a, 3);
  12.   WypiszLiczbe(a); // 00101_2
  13.   a = UstawBit(a, 4);
  14.   WypiszLiczbe(a); // 10101_2
  15.   system("pause");
  16.   return 0;
  17. }