Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Podobne dokumenty
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Podstawy programowania w języku C i C++

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Arytmetyka liczb binarnych

Języki i paradygmaty programowania

Spis treści JĘZYK C - OPERATORY BITOWE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

1. Operacje logiczne A B A OR B

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Operacje arytmetyczne

Podstawy programowania w języku C

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Kod U2 Opracował: Andrzej Nowak

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Wykład 2. Informatyka Stosowana. 8 października 2018, M. A-B. Informatyka Stosowana Wykład 2 8 października 2018, M. A-B 1 / 41

Mikrooperacje. Mikrooperacje arytmetyczne

Zapis liczb binarnych ze znakiem

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Wstęp do programowania

2 Przygotował: mgr inż. Maciej Lasota

Język C zajęcia nr 11. Funkcje

Podstawy i języki programowania

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

( wykł. dr Marek Piasecki )

Podstawy Informatyki

Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

SYSTEMY LICZBOWE. Zapis w systemie dziesiętnym

Pracownia Komputerowa wykład V

SYSTEMY LICZBOWE 275,538 =

Podstawy programowania w C++

Spis treści JĘZYK C - INSTRUKCJA SWITCH, OPERATORY BITOWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05

Różności w C++ Marek Pudełko

B.B. 2. Sumowanie rozpoczynamy od ostatniej kolumny. Sumujemy cyfry w kolumnie zgodnie z podaną tabelką zapisując wynik pod kreską:

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wstęp do programowania. Reprezentacje liczb. Liczby naturalne, całkowite i rzeczywiste w układzie binarnym

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Stan wysoki (H) i stan niski (L)

while(wyrażenie) instrukcja

LICZBY ZMIENNOPRZECINKOWE

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

ZADANIE 1. Rozwiązanie:

Systemy liczbowe używane w technice komputerowej

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Java Podstawy. Michał Bereta

MATERIAŁY DO ZAJĘĆ II

Podstawy programowania C. dr. Krystyna Łapin

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

ZASADY PODZIAŁU SIECI NA PODSIECI, OBLICZANIA ADRESÓW PODSIECI, ADRESÓW HOSTÓW I ADRESU ROZGŁOSZENIOWEGO

MNOŻENIE W SYSTEMACH UZUPEŁNIENIOWYCH PEŁNYCH (algorytm uniwersalny)

dr inż. Jarosław Forenc

Języki i metody programowania I

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Luty 2001 Algorytmy (7) 2000/2001

IX. Wskaźniki.(3 godz.)

Tranzystor JFET i MOSFET zas. działania

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Operacje arytmetyczne w systemie dwójkowym

Podstawy programowania w C++

Logika Temporalna i Automaty Czasowe

Pozycyjny system liczbowy

Architektura komputerów ćwiczenia Bramki logiczne. Układy kombinacyjne. Kanoniczna postać dysjunkcyjna i koniunkcyjna.

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Pracownia Komputerowa wyk ad V

Podstawy Informatyki dla Nauczyciela

Stałe definiuje się używając funkcji define. Przykład: define( PODATEK, 22); define( INSTALACJAOS, 70); define( MS, Microsoft );

Logika Temporalna i Automaty Czasowe

Podstawy programowania skrót z wykładów:

System liczbowy jest zbiorem reguł określających jednolity sposób zapisu i nazewnictwa liczb.

C++ wprowadzanie zmiennych

Podstawy Automatyki. Wykład 9 - Podstawy matematyczne automatyki procesów dyskretnych. dr inż. Jakub Możaryn. Instytut Automatyki i Robotyki

Warunki logiczne instrukcja if

Sprawozdanie z zajęć laboratoryjnych: Technologie sieciowe 1

Struktura pliku projektu Console Application

do instrukcja while (wyrażenie);

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Adam Korzeniewski p Katedra Systemów Multimedialnych

Cyfrowy zapis informacji. 5 grudnia 2013 Wojciech Kucewicz 2

Architektura komputerów. Asembler procesorów rodziny x86

Adam Korzeniewski p Katedra Systemów Multimedialnych

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Transkrypt:

Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com Spójrzmy na następujące zdanie: Jeśli mamy trochę wolnego czasu i (ang. and) pogoda jest dobra, to pójdziemy na spacer. Użyliśmy kombinacji "and", co oznacza, że chodzenie na spacer zależy od jednoczesnego spełnienia dwóch warunków mamy trochę wolnego czasu; pogoda jest dobra. W języku logiki takie warunki łączenia nazywa się koniunkcją (iloczynem zdań) oznaczenie w języku C++ - && - operator logiczny AND Pozwala nam kodować złożone warunki bez użycia nawiasów takich jak ten licznik > 0 && wartość == 100 Wynik operatora && może być określony przez tzw. Tablicę prawdy

OR - A teraz kolejny przykład: Jeśli jesteś w centrum handlowym lub (ang. or) jestem w centrum handlowym, jeden z nas kupi prezent dla mamy. Użycie słowa "lub" oznacza, że zakup zależy od co najmniej jednego z tych warunków. W logice związek taki jak ten nazywany jest alternatywą (sumą logiczną) oznaczenie w języku C++ - - operator logiczny OR. Jest to operator binarny o priorytecie niższym niż && (podobnie jak "+" w porównaniu do "*"). Jego tabela prawdy wygląda tak: NOT -! Ponadto istnieje inny operator, który może zostać użyty do skonstruowania warunków. To jednoargumentowy operator dokonujący logicznej negacji. Jego działanie jest proste: zamienia prawdę w fałsz i fałsz w prawdę. - oznaczenie w języku C++ -! (wykrzyknik) - jego priorytet jest bardzo wysoki: taki sam jak operatorów inkrementacji i dekrementacji. Tabela prawdy

Przykłady użycia operatorów logicznych Zwróć uwagę, że następujące warunki są równoważne sobie nawzajem Zmienna> 0!(Zmienna <= 0) Zmienna!= 0!(Zmienna == 0) Prawa De Morgana Negacja koniunkcji (iloczynu logicznego) jest przeciwieństwem negacji.!(p && q) ==!p!q Negacja przeciwieństwa jest połączeniem negacji (iloczynem logicznym negacji)!(p q) ==!p &&!q

Operatory bitowe AND, OR,NOT, XOR Operatory logiczne przyjmują argumenty jako całość, niezależnie od liczby bitów, które zawierają. Operatory znają tylko wartości 0 - fałsz (gdy wszystkie bity są resetowane), lub nie 0 - prawda (gdy ustawiony jest co najmniej jeden bit). Wynikiem ich operacji jest albo wartość 0 (fałsz), albo 1 (prawda). Operatory bitowe & (AND) (ampersand) koniunkcja bitowa wymaga dokładnie dwóch "1", aby w rezultacie uzyskać "1" (OR)(bar) rozróżnianie bitowe wymaga co najmniej jednego "1" jako wyniku "1" ^ (XOR)(caret) bitowy wyłączny lub (albo) wymaga dokładnie jednego "1", aby podać "1"

~ (NOT) (tylda) bitowa negacja dla 1 jako wynik poda 0 i odwrotnie dla 0 poda 1 UWAGA: argumenty tych operatorów muszą być liczbami całkowitymi (int, a także long, short lub char).

Różnica w działaniu operatorów logicznych i bitowych 1. Operatory logiczne nie wnikają do poziomu bitów argumentu. Interesuje je tylko końcowa wartość całkowita. 2. Operatory bitowe są bardziej rygorystyczne: zajmują się każdym bitem osobno. Jeśli przyjmiemy, że zmienna int zajmuje 32 bity, można sobie wyobrazić operację bitową jako 32-krotną ocenę operatora logicznego dla każdej pary bitów argumentów. Ta analogia jest oczywiście niedoskonała, ponieważ w rzeczywistości wszystkie 32 operacje wykonywane są w tym samym czasie.

Sposoby użycia operatorów logicznych i bitowych Pokażemy teraz przykład różnicy operacji między operacjami logicznymi i bitowymi. Załóżmy, że wykonano następującą deklarację: int i = 15, j = 22; Jeśli założymy, że typ zmiennej int jest przechowywany jako liczba 32 bitowa, to obraz bitowy dwóch zmiennych będzie wyglądał następująco Użycie operatora logicznego - operacja logiczna (AND) Zapis w C++ int log = i && j; Mamy do czynienia z iloczynem logicznym. Prześledźmy przebieg obliczeń. Obie zmienne i i j nie są zerami, więc będą uważane za reprezentujące "prawdę". Jeśli sprawdzimy tabelę prawdy dla operatora &&, widzimy, że wynik będzie "prawdą", dla tych wartości, gdzie liczba całkowita jest równą 1. Oznacza to, że bitowy obraz zmiennej log jest następujący:

Użycie operatora bitowego operacja bitowa (AND) Zapis w C++ int bit = i & j; Operator & będzie działał z każdą parą odpowiednich bitów osobno, tworząc wartości odpowiednich bitów wyniku. Dlatego wynik jest taki Użycie operatora logicznego operacja logiczna (NOT) Zapis w C++ int logneg =! i; Zmienna logneg zostanie ustawiona na 0, więc jej obraz będzie składał się tylko z zer. Użycie operatora bitowego operacja bitowa (NOT) Zapis w C++ int bitneg = ~ i; Może cię zaskoczyć fakt, że wartość zmiennej bitneg wynosi -16. Dziwne? Nie, wcale nie!

Możemy użyć każdego z poprzednich dwóch argumentów operatorów w ich skróconej formie. Oto przykłady równoważnych notatek.

Operacje na bitach Do czego można użyć operatorów bitowych? PROBLEM Wyobraź sobie, że musisz napisać ważny element systemu operacyjnego. 1. Powiedziano Ci, że musisz użyć zmiennej zadeklarowanej w następujący sposób: Zmienna przechowuje informacje o różnych aspektach działania systemu. Każdy bit zmiennej przechowuje jedną wartość tak / nie. 2. Powiedziano ci również, że tylko jeden z 32 bitów możesz wykorzystać - bit numer trzy (pamiętaj, że bity są ponumerowane od 0, a bit 0 jest najniższy, a najwyższy to 31). Pozostałe bity nie mogą się zmienić, ponieważ są przeznaczone do przechowywania innych danych. Oto twój bit oznaczony literą "x"

PRZYKŁAD 1. Sprawdzenie stanu swojego bitu; porównanie całej zmiennej do zera nie spowoduje niczego, ponieważ pozostałe bity mogą mieć całkowicie nieprzewidywalne wartości, ale możemy użyć następującej właściwości koniunkcji: x & 1 = x x & 0 = 0 Jeśli zastosujemy operację & do zmiennej FlagRegister wraz z następującym obrazem bitowym: 00000000000000000000000000001000 (zauważ "1" na pozycji twojego bitu), otrzymujemy jeden z następujących łańcuchów bitów: a. jeśli twój bit był ustawiony na "1", 00000000000000000000000000001000 b. jeśli twój bit został zresetowany do "0" UWAGA: 00000000000000000000000000000000 Ta sekwencja zer i jedynek, której zadaniem jest pobranie wartości lub zmiana wybranych bitów, nazywana jest maską bitową. 2. Tworzenie maski bitowej - aby wykryć stan swojego bitu. Powinien wskazywać na trzeci bit. Ten bit ma wagę 2 3 = 8. Powinniśmy być w stanie stworzyć odpowiednią maskę poprzez deklarację: int TheMask = 8; Możemy również wykonać sekwencję instrukcji w zależności od stanu twojego bitu if(flagregister & TheMask) { /* mój bit jest ustawiony */ } else { /* mój bit jest resetowany */ }

3. Zresetowanie bitu - przypisujesz zero do bitu, podczas gdy wszystkie inne bity pozostają niezmienione; - użyjemy tej samej właściwości spójnika jak poprzednio, ale użyjemy nieco innej maski - tak jak poniżej: 1111111111111111111111111111110111 Zwróć uwagę, że maska została utworzona w wyniku negacji wszystkich bitów zmiennej TheMask. Resetowanie bitu jest proste i można wykonać na dwa sposoby (wybierz ten, który wolisz) 4. Ustawianie swojego bitu - przypisujesz "jeden" do swojego bitu, podczas gdy wszystkie inne bity pozostają niezmienione; użyjemy następującego operatora bitowego : x 1 = 1 x 0 = x Ustaw swój bit za pomocą jednej z następujących instrukcji

5. Negacji bitu - zamienisz "jeden" na "zero" i "zero" na "jeden". Użyj interesującej właściwości operatora xor: x ^ 1 =! x x ^ 0 = x Dokonaj negacji za pomocą następujących instrukcji 6. Przesuwanie bitu - ma zastosowanie tylko do wartości całkowitych i nie można go używać z argumentami typu float. UWAGA: Operacji tej używa się nieświadomie przez cały czas. Jak pomnożyć dowolną liczbę przez 10? Spójrz: 12345 10 = 123450 - jak widzisz, pomnożenie przez dziesięć to tylko przesunięcie wszystkich cyfr w lewo i dodanie "0" w prawo. Jak podzielić przez 10? Spójrzmy: 12340 10 = 1234 - wystarczy przesunąć cyfry w prawo. Komputer wykonuje ten sam rodzaj operacji z jedną różnicą: ponieważ 2 jest podstawą dla liczb binarnych (nie 10), przesunięcie wartości o jeden bit w lewo odpowiada pomnożeniu przez 2;

odpowiednio, przesunięcie jednego bitu w prawo jest jak dzielenie przez 2 (zauważ, że najbardziej prawy bit jest tracony). Przesunięcie bitów może być: logiczne, arytmetyczne, czy wszystkie bity zmiennej są przesunięte; tego rodzaju zmiana ma miejsce, gdy zastosujesz ją do liczb całkowitych bez znaku; jeśli przesunięcie pomija tak zwany bit znaku - w notacji uzupełnienia dwójkowego rolę bitu znaku pełni najwyższy bit zmiennej; jeśli jest równy "1", wartość jest traktowana jako wartość ujemna; oznacza to, że przesunięcie arytmetyczne nie może zmienić znaku przesuniętej wartości. Operatorami zmian w języku "C ++" jest para dwuznaków, << i >>, wyraźnie wskazująca kierunek, w którym będzie działać zmiana. Lewy argument tych operatorów jest wartością całkowitą, której bity są przesunięte. Właściwy argument określa rozmiar przesunięcia. Pokazuje to, że ta operacja z pewnością nie jest przemienna. Priorytet tych operatorów jest bardzo wysoki.

PRZYKŁAD Załóżmy, że istnieją następujące deklaracje: int Signed = -8, VarS; unsigned Unsigned = 6, VarU; spójrz na te zmiany /* równoważne dzieleniu przez 2 / > VarS == -4 */ VarS = Signed >> 1; / * odpowiednik mnożenia przez 4 -> VarS == -32 * / VarS = Signed << 2; /* odpowiednik dzielenia przez 4 > VarU == 1 */ VarU = Unsigned >> 2; /* odpowiednik mnożenia przez 2 > VarU == 12 */ VarU = Unsigned << 1; Możemy użyć obu operatorów za pomocą poniższego sposobu zapisu: Signed >>= 1; / * dzielenie przez 2 * / Unsigned <<= 1; / * mnożenie przez 2 * / Tabela priorytetów zawierająca wszystkie operatory