Operatorzy bitowate w c

Operatorzy bitowate w c
W tym Wskazówka Linux Artykuł, wyjaśniono wszystko o operacjach logicznych bitowców. Korzystając z praktycznego przykładu z fragmentami kodu obrazu, zobaczymy szczegółowo każdy z operatorów logicznych używanych w języku C.

Wyjaśnimy również, jak wykonywać maskowanie bitów za pomocą operacji logicznych, ponieważ jest to coś bardzo przydatnego w programowaniu i jest całkowicie powiązane z tego typem operatorów.

Opis operacji bitowych

Operacje bitowe są logiczne, a operacje zmiany biegów są stosowane indywidualnie do każdego bitu zmiennej. Na przykład, jeśli zastosujemy operację i między zmiennymi „a” i „b”, bit 0 z „a” zostanie powiązany z bitami 0 z „b”, bit 1 „a” zostanie powiązany z bitami 1 z „B” ”i tak dalej.

Każdy bit działa i zwraca własny wynik i nie ma wpływu na wynik przylegających do niego bitów.

Ten typ operacji jest bardzo przydatny w maskowaniu bitów podczas korzystania z flag kontrolnych lub wskaźników zgrupowanych w pojedynczy element danych, taki jak liczba całkowita.

Jak przypisać wartość binarną do zmiennej w języku C

Zanim zaczniemy wyjaśniać, o co chodzi o operacje logiczne bitwiste, przyjrzyjmy się, jak przypisać wartość do zmiennej w kodzie binarnym, ponieważ chociaż możemy to zrobić w dziesiętnym, sześciokadcimalnym lub innym reprezentacji, wizualizacja 1S i 0 tworzy programowanie o wiele bardziej praktyczne i zrozumiałe. Na przykład w przypadkach, w których bity reprezentują flagi kontrolne lub wskaźniki zgrupowane w zmienną INT, podwójną lub inną.

Aby przypisać wartość do zmiennej w formacie binarnym, musimy poprzedzić reprezentację binarną „0b”. Poniższy fragment przypisuje wartość 131 lub 0B10000011 do liczby całkowitej „A” w formacie binarnym, a następnie wyświetla swoją reprezentację dziesiętną w konsoli dowodzenia.

#włączać
void main ()
int a;
A = 0B10000011;
printf („reprezentacja dziesiętna dla 0B10000011 to: %i \ n”, a);

Poniższy obraz pokazuje wynik tego kodu.

Reprezentowanie wartości binarnych w operacjach bitowych i maskowania sprawia, że ​​programowanie jest znacznie bardziej płynne i zrozumiałe i pozwala uniknąć błędów lub konwersji, które kosztują czas.

Nie operator

Operator logiczny dla nie jest symbolem „~”.

Logiczna operacja nie lub negacja jest najprostsza ze wszystkich, mając tylko jedno wejście i jedno wyjście.

Ta operacja zwraca w swoim wyjściu odwrócona wartość binarna jej wejścia.

Rozważ następujące wyrażenie dla operacji logicznej, a nie przy wejściu „a”

c = ~ a

Wynik „c” jest równy 1, jeśli „a” jest równy 0, a „c” jest równe 0, jeśli „a” jest równe 1. Ta operacja jest powszechnie stosowana do uzyskania uzupełniającej wartości zmiennej.

Następnie spójrzmy na tabelę prawdy dla operacji nie.

A ~ = C
0 ~ = 1
1 ~ = 0

Przykład:

W tym przykładzie zastosujemy operację nie do zmiennej A, aby uzyskać jej uzupełnienie w „C”

Aby to zrobić, tworzymy zmienną A typu niepodpisanego char, przypisujemy jej wartość 131 i uzyskuje wynik „C”. Następnie używamy funkcji printf (), aby wyświetlić wynik w konsoli poleceń. Poniżej możemy zobaczyć kod do tego celu.

#włączać
void main ()

niepodpisany char c;
niepodpisany char a;
A = 0B01111100;
c = ~ a;
printf („\ n reprezentacja dziesiętna dla 0b10000011 to: %i \ n”, c);

Na poniższym rysunku widzimy wynik uzupełnienia „a” . W takim przypadku dopełnienie lub odwrotność 131 wynosi 124 lub 01111100 w binarnej reprezentacji.


Logiczny i operator

Operator logiczny dla i operacji jest symbolem „&”

Spójrzmy na następujące wyrażenie dla logicznego i działania między zmiennymi A i B

C = A&B.

Wynik „C” jest równy 1 tylko wtedy, gdy „A” i „B” są równe 1. We wszystkich innych przypadkach „C” jest równe 0.

Następnie patrzymy na tabelę prawdy dla operacji i.

A I B = C
0 I 0 = 0
0 I 1 = 0
1 I 0 = 0
1 I 1 = 1

Operacja logiczna i jest bardzo przydatna w maskowaniu bitowym. Później zobaczymy sekcję wyjaśniającą tę technikę bardziej szczegółowo.

Przykład:

Teraz zobaczmy przykład, w którym wykonujemy logiczne i działające między zmiennymi „a” i „b” typu bez znaku i przechowuj wynik w „c”, aby wyświetlić go później w konsoli poleceń.

Przypisujemy wartość 135 lub 10000111 do zmiennej „a” i 129 lub 1000001 do zmiennej „b” w reprezentacji binarnej. Następnie użyjemy operatora „&” do wykonywania operacji. Następnie zobaczymy kod tego.

#włączać
void main ()

niepodpisany Char A = 0B10000111;
niepodpisany Char B = 0B10000001;
niepodpisany char c;
c = a & b;
printf („\ n Rezultat A&B to: %i \ n”, c);

Obraz pokazuje wynik tego kodu, w którym działanie między „a” i „b” powodują 129 lub 10000001 w binarie.

Logiczny lub operator

Operator logiczny dla operacji jest symbolem ”| ".

Spójrzmy na następujące wyrażenie dla logicznego lub operacji między zmiennymi A i B

C = do | B.

Wynik „C” będzie równy 1 tylko wtedy, gdy „a” lub „b” lub „a” i „b” równe 1, podczas gdy będzie równy 0 tylko wtedy, gdy „a” i „b” równe 0.

Następnie spójrzmy na tabelę prawdy dla operacji.

Do | B = C
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Przykład

W tym przykładzie zobaczymy, jak wykonać operację logiczną lub między zmiennymi „a” i „b” typu bez znaku i przechowywać wynik w „c”, aby wyświetlić go później w konsoli dowodzenia.

Przypisujemy wartość 128 lub 10000 000 do zmiennej „A” i 3 lub 00000011 do zmiennej „B” w reprezentacji binarnej. Następnie użyjemy operatora „|” do wykonania operacji. Następnie zobaczymy kod tej operacji.

#włączać
void main ()

niepodpisany Char A = 0B10000000;
niepodpisany Char B = 0B00000011;
niepodpisany char c;
C = do | B;
printf („\ n wynik A | b to: %i \ n”, c);

Na poniższym obrazku widzimy wynik operacji c = a | b, które w tym przypadku wynosi 131 lub 10000011 w binarie.

Operator logiczny XOR lub ekskluzywny lub

Operator logiczny operacji XOR jest symbolem „ ^”.

Spójrzmy na następujące wyrażenie dla logicznej operacji XOR między zmiennymi A i B

c = a ^ b.

Wynik „C” jest równy 1 tylko wtedy, gdy jedno z bitów „A” lub „B” jest równe 1, ale jest to 0, jeśli „A” i „B” są równe 1 lub równe 0.

Ta operacja jest niezbędna w dodatkach, ponieważ w systemie binarnym 1 + 0 = 1 lub 0 + 1 jest również równe 1. Ale 1 + 1 = 0 z przeniesieniem do następnego wyższego bitu. W takim przypadku noszenie jest wykonywane przez operację i.

Następnie patrzymy na tabelę prawdy dla operacji XOR.

A ^ B = C
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Przykład

Teraz spójrzmy na przykład, w którym wykonujemy operactwo logiczne XOR między zmiennymi „A” i „B” typu bez znaku i przechowuj wynik w „C”, aby wyświetlić go później w konsoli dowodzenia.

Przypisujemy wartość 135 lub 10000111 do zmiennej „a” i 3 lub 00000011 do zmiennej „b” w notacji binarnej. Następnie użyjemy operatora „ ^” do wykonywania operacji logicznej. Następnie zobaczymy kod tego.

#włączać
void main ()

niepodpisany Char A = 0B10000111;
niepodpisany Char B = 0B00000011;
niepodpisany char c;
c = a ^ b;
printf („\ n wynik A | b to: %i \ n”, c);

Jak widać na obrazie, wynik to 10000100, a bity, których dwa wejścia są = 1 XOR, wyniki w 0.

Operatorzy z przypisaniem

Operatorzy z przypisaniem wykonują te same operacje logiczne, które widzieliśmy wcześniej, ale ich wynik jest przechowywany w operandu poprzedzającym operator.

Poniższe wyrażenie wykonuje logiczny i działający między zmienną „A” a zmienną lub wartością przypisaną po operatorze, a wynik jest zwracany w „A”.

A & = 55;

Operatorzy rotacji

Operatorzy rotacji to „< > ".

Operatorzy ci przesuwają dane zmiennej odpowiednio przez „N” bity na lewo lub w prawo.

W poniższym wyrażeniu operator przesuwa dane przechowywane w „A” 5 bitów w lewo.

A = a < < 5

Przykład

W tym przykładzie przypiszmy wartość 0B000001 do zmiennej „A”, a następnie przesuniemy 1 bit w lewo w pętli i wyprowadzi wynikową wartość w konsoli poleceń. Ten cykl jest powtarzany 8 razy

#włączać
void main ()

niepodpisany Char A = 0B00000001;
niepodpisany char c;
dla (int bit = 0; bit!= 8; bit ++)
printf („%i \ n”, a);
A = a<<1;

Na poniższym obrazie widzimy wynik z wartościami dziesiętnymi odpowiadającymi każdej pozycji bitów w postaci niepodpisanej.

Bit Maskowanie

W niektórych przypadkach, na przykład po definiowaniu wielu flag kontrolnych zgrupowanych w jednym rejestrze, musimy tylko wiedzieć lub zmienić wartość jednego lub więcej bitów, a nie całego rejestru.

Aby uzyskać status jednego lub bardziej określonych bitów, musimy zdefiniować maskę, która ustawia tylko bity elementów, których wartość chcemy znać na 1.

Na przykład, jeśli chcemy uzyskać wartość bitów 0 i 2 zmiennej „a”, musimy zdefiniować następującą maskę i wykonać i działać.

00000101

W takim przypadku tylko status bitów 0 i 2 zostaną zwrócone w rezultacie, pozostałe bity będą miały wartość = 0, niezależnie od wartości „a”.

Aby zmienić wartość, musimy zastosować operację między maską z bitami, które chcemy ustawić na 1, a zmienną, którą chcemy zmienić. Jeśli chcemy ustawić go na 0, musimy odwrócić maskę, jak pokazano poniżej i zastosować działalność.

11111010

Przykład

W tym przykładzie używamy maskowania bitowego, aby stworzyć prosty i praktyczny konwerter z liczb dziesiętnych do sznurka z binarną reprezentacją.

Do tej rozmowy użyjemy 8 masek, po jednej dla każdego bitu, ale aby programowanie było bardziej praktyczne i wyraźniejsze, najpierw użyjemy maski 10000000, a następnie przesuniemy jeden bit w prawo w każdym cyklu pętli. W ten sposób otrzymamy następujące 8 masek, których potrzebujemy.

10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

Konwerter składa się z pętli dla 8 cykli, w każdym z nich, pyta o status odpowiedniego bitu. Odbywa się to przez a i działanie między danymi, które mają zostać przekonwertowane a odpowiadającą maską.

Jeśli wynik operacji w „C” wynosi 0, wypisz tę wartość za pomocą funkcji printf (). W przeciwnym razie, jeśli wartość bitu wynosi 1, zostanie wydrukowana w konsoli dowodzenia.

Poniżej znajduje się kod tego poręcznego konwertera.

#włączać
void main ()
niepodpisany char a = 143;
niepodpisany Char B = 0B10000000;
niepodpisany char c;
printf („\ n binary reprezentacja a jest:”);
dla (int bit = 0; bit!= 8; bit ++)
c = a & b;
if (c == 0)
printf („0”);
w przeciwnym razie
printf („1”);
B = B >> 1;
c = 0;

printf ("\ n \ n");

Na poniższym obrazie widać poniżej wynik konwersji dla liczby 143.

Wniosek

W tym Wskazówka Linux Artykuł, wyjaśniliśmy każdy z operatorów logicznych i rotacji, które Język C zapewnia przetwarzanie bitwenne. Dla każdego z tych operatorów utworzyliśmy sekcję pokazującą symbol użyty dla tego opisu operatora i praktyczny przykład z fragmentami kodu i obrazów dla każdego. Uwzględniliśmy również sekcję dotyczącą maskowania bit i co jest dodatkiem, który jest całkowicie powiązany z operacją logiczną tego typu.