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ć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 = ~ aWynik „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ć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ć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ć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ć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 < < 5Przykł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ć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ć.
00000101W 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ść.
11111010Przykł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.
10000000Konwerter 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ć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.