W tym poście chciałbym zapisać sposoby wykonywania operacji na bitach.
Głównym wykorzystywanym znakiem jest << lub >>. Informuje on w którą stronę dane będą przesuwane czy w stronę wyższej potęgi (<<), czy może w stronę niższej (>>).
Poniżej przedstawiam kilka programów napisanych w języku C, zaprezentują one działanie poszczególnych operacji bitowych wymienionych wcześniej.
W pierwszym programie przedstawiłem w jaki sposób przesuwać bity w podanym słowie:
Ustawienie wybranego bitu w słowie:
Zerowanie podanego bitu w słowie:
Wyzerowanie podanych b:
Zanegowanie wybranych bitów:
Rodzaje operacji:
Głównym wykorzystywanym znakiem jest << lub >>. Informuje on w którą stronę dane będą przesuwane czy w stronę wyższej potęgi (<<), czy może w stronę niższej (>>).
Poniżej przedstawiam przykładowe deklaracje różnych operacji na bitach.
- Ustawienie wybranego bitu y w słowie X. Liczenie rozpoczyna się od zera.
- X |= 1<<y
- Rozwinięcie linii pokazanej powyżej. Pozwala na ustawienie różnych bitów w pojedynczym słowie.
- X |= 1<<y | 1<<k
- Zerowanie wybranego bitu w słowie
- X &=~(1<<y)
- Wyzerowanie podanych bitów odpowiednio o numerach x, z, oraz v+2
- X &=~(1<z | 1<< y | 4<<v)
- Zanegowanie wybranego bitu w podanym słowie.
- X ^=1<<n
- Zanegowanie grupy bitów w podanym słowie, odpowiednio o numerach z oraz y+1
- X ^= 1<<z | 2<<y
- Przesunięcie bitów w określoną stronę
- X = 1<<y
- Bądź w drugą:
- X = 1>>y
Programy:
Poniżej przedstawiam kilka programów napisanych w języku C, zaprezentują one działanie poszczególnych operacji bitowych wymienionych wcześniej.
W pierwszym programie przedstawiłem w jaki sposób przesuwać bity w podanym słowie:
#include <stdio.h> #include <stdlib.h> int main() { int a = 9; /* * Binarnie: 00001001 * wypisze 9 */ printf ("a = %d\n", a); /* * Binarnie: 00100100 //wypisze 36 * Przesunięcie zaznaczonych bitów o dwa miejsca * w stronę wyższej potęgi */ printf ("9 << 2 = %d\n", a<<2); /* * Binarnie: 00000010 //wypisze 2 * Przesunięcie zaznaczonych bitów o dwa miejsca * w stronę niższej potęgi liczby które znajdą się */ printf ("9 >> 2 = %d\n", a>>2); return 0; }
Ustawienie wybranego bitu w słowie:
#include <stdio.h> #include <stdlib.h> int main() { int a = 9; /* * Binarnie: 00001001 * wypisze 9 */ printf ("a = %d\n", a); /* * Ustawienie wybranego bitu w słowie, liczenie od 0 * Ustawiony został bit 5 więc wyświetli się wartość: * Binarnie 00101001, 32 + 8 + 1 = 41 */ printf ("%d\n", a |= 1<<5); return 0; }
Zerowanie podanego bitu w słowie:
#include <stdio.h> #include <stdlib.h> int main() { int a = 9; /* * Binarnie: 00001001 * wypisze 9 */ printf ("a = %d\n", a); /* * Zerowanie wybranego bitu w słowie, liczenie od 0 * Wyzerowany został bit nr 3. * Binarnie: 00000001, Dziesiętnie: 1 */ printf ("9 << 2 = %d\n", a &=~(1<<3)); return 0; }
Wyzerowanie podanych b:
#include <stdio.h> #include <stdlib.h> int main() { int a = 255; /* * Binarnie: 11111111 * wypisze 9 */ printf ("a = %d\n", a); /* * Zerowanie wybranego bitu w s³owie, liczenie od 0 * Wyzerowany zostal bit nr 6 oraz 7, * Ostatnie polecenie zeruje bit 2 + 1 = 3 * Binarnie: 00110111, Dziesiêtnie: 55 */ printf ("= %d\n", a &=~(1<<6 | 1<<7 | 4<<1)); return 0; }
Zanegowanie wybranych bitów:
#include <stdio.h> #include <stdlib.h> int main() { int a = 55; /* * Binarnie: 00110111 * wypisze 9 */ printf ("a = %d\n", a); /* * Zanegowanie wybranych bitów, liczenie od 0 * Zanegowane zostają następujące bity 7, 6, 2, 1, * Binarnie 11100111, Dziesiętnie: 11110001 */ printf ("= %d\n", a ^=1<<7 | 1<<6 | 1<<2 | 1<<1); return 0; }