Wyjściowka nr. 2 :)

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Pytania i zadania

Oto odpowiedzi do pytań zadanych na kolokwium. Okazało się, że nawet proste pytania były trudne :( dla sporej grupy studentów :( Dlatego tym razem troszkę szerszy i dokładniejszy opis. Na kolokwium wystarczyło napisać jedno, dwa zdania na temat i z sensem, żeby pokazać, że się rozumie...

Zadania dla grupy 1

  1. Wyjaśnij, jak działa operator predekrementacji.
    Operator predekrementacji wygląda dla zmiennej $a tak: --$a. Jego działanie polega na zmniejszeniu wartości zmiennej $a o jeden (jeżeli była to liczba całkowita lub rzeczywista, w przeciwnym wypadku wartość zmiennej jest interpolowana jak liczba 0, co prowadzi do wyniku -1 za każdym razem, gdy zmienna nie zawierała prawidłowej liczby). Wartością wyrażenia (--$a) jest nowa wartość zmiennej, po modyfikacji. Przykłady: $a = 1; --$a; # a uzyska wartość 0 $a = 0; --$a; # uzyska wartość -1 $a = 2.12; --$a; # uzyska wartość 1.12 $a = 'ab'; --$a; # uzyska wartość -1 $a = undef; --$a; # uzyska wartość -1 Jeżeli w danym wyrażeniu znajduje się wiecej operatorów predekrementacji i działają one na tę samą zmienną wielokrotnie, ujawnia się dodatkowy efekt/właściwość tego operatora: wynikiem obliczenia (--$a) jest referencja do $a (niejawnie wstawiana w to samo miejsce). Dlatego każda następna modyfikacja zmiennej w tym samym wyrażeniu wpływa przez efekt synergii na poprzednio obliczoną wartość, która nie została zwrócona, lecz udostępniona przez referencję. Przykład:$a = 0; $b = --$a + --$a;Działanie operatora -- polega tu na tym, że pierwsze wyrażenie --$a modyfikuje wartość $a, początkowo równą zero, ustawiając ją na -1, a następnie zwraca referencję do zmiennej $a (wewnętrznie trafia ona jako lewy argument do operatora + dwuargumentowego). Następnie obliczana jest wartość drugiego wyrażenia --$a, gdzie $a ma początkową wartość równą -1. Operator zmienia tę wartość na -2, i zwraca referencję do zmiennej. Jednocześnie, ponieważ zmianie uległa zmienna $a, referencja z pierwszego wyrażenia też pokazuje na nową wartość, zatem operator + w efekcie obliczy wyrażenie -2 + -2, co da w efekcie -4. W przypadku wyrażenia --$a + --$a + --$a wynikiem jest -7, co może być zaskakujące, ale jest naturalne. Operator plusa dwuargumentowego oblicza swoje argumenty w takiej kolejności, że najpierw zostanie obliczony lewy, a potem prawy argument. Jeżeli w wyrażeniu występuje więcej plusów, najpierw obliczony zostanie ten, który jest najbardziej po lewej (to obliczanie od lewej do prawej to właśnie cecha zwana lewostronnością argumentu). Obliczenie takie jak powyżej zostanie więc przekształcone wewnętrznie w wyrażenie pośrednie, które będzie miało postać -4 + --$a, i przy wartości $a równej -2 spowoduje redukcję do postaci -4 + -3, to właśnie jest równe siedem. Kolejny taki wyraz z dekrementacją zmiennej $a dałby wynik -11, itp.
  2. Wyjaśnij dlaczego dwa poniżej przedstawione programy wydają się działać dokładnie tak samo (to znaczy - pozornie nic nie robią): perl -le '$a=0;$b=1; print $a=1 < $b' perl -le '$a=0;$b=1; print $a=1 > $b'
    Wyrażenia powyższe działają w sposób następujący: w obu przypadkach ustawiana jest zmienna $a na 0, i zmienna $b na 1. Następnie wykonywana jest instrukcja porównania liczby 1 ze zmienną $b, a wynik tego porównania jest przypisywany do zmiennej $a. Kolejność działań w wyrażeniu $a = 1 < $b wynika z priorytetów operatorów (i TYLKO z tego). Zatem operator < (oraz > w drugim przypadku) mają większy priorytet od operatora przypisania, zatem wykonają się pierwsze. Spowoduje to redukcję wyrażenia do postaci $a = 1 < 1; oraz $a = 1 > 1;. Ostra nierówność takich samych wartości nie zachodzi, zatem wynikiem tego porównania jest fałsz. Wynik ten jest wpisywany do zmiennej $a, a następnie rezultat przypisania (czyli operacji ($a='') - wynikiem tego porównania jest pusty napis!) jest wpisywany przez operator print. Ponieważ jest to tylko napis pusty, a perl został uruchomiony z opcją -l, widać jedynie pojawienie się znaku nowego wiersza w wyniku (patrz rys. 1):
    zadanie 2 z koła 2
    Rys. 1. Efekt wykonania programów z zadania wcale nie oznacza, że NIC nie zostało wykonane. Wykonane zostało print "\n"; oraz wcześniej parę obliczeń.
  3. Dlaczego wynik działania polecenia print (1+1)*2 wynosi 2?
    Jest tak dlatego, że w tej wersji wyrażenia perl interpretuje polecenie print jak funkcję. Funkcja ta pobiera argumenty wyłącznie z tego, co umieszczono w nawiasie. Elementy wyrażenia znajdujące się poza nawiasem nie będą zatem przetwarzane przez polecenie print. Działanie wyrażenia jest następujące: najpierw wykonuje się polecenie print(2), a następnie jego wartość (wynosząca 1 - print to przecież zwykła funkcja, której udało się coś napisać) jest w kontekście pustym mnożona przez dwa. Kontekst pusty jest dlatego, że nic więcej nie dzieje się z wynikiem tego obliczenia - jest tak, jakbyśmy po prostu w kodzie wpisali np. 1*2; (co jest bez sensu). Wykonuje się zatem na końcu działanie 1*2 i tego już nie widzimy, bo nie ma żadnej innej instrukcji, która wynik tego działania wypisałaby na ekran. Można użyć drugiego print, aby przekonać się, że rzeczywiście działanie zachodzi: print print (1+1)*2;Zobacz rys. 2:
    zadanie 3 z koła 2
    Rys. 2. Sprawdzenie że działania podane w zadaniu 3 wykonują się rzeczywiście.
  4. Jak to możliwe, że polecenie print 1+2<0+3 nic nie wypisuje? Wyjaśnij przyczynę.
    Cały sekret tkwi znowu w priorytetach operatorów. Mamy tutaj polecenie print, które jest przez perla traktowane jak operator listowy (ponieważ nie ma otwierającego nawiasu). Polecenie print pobiera argument, który jest wyrażeniem, zatem najpierw zostaje obliczone to pobrane wyrażenie. Ze względu na to, że operator dwuargumentowy + ma wyższy priorytet od operatora porównania numerycznego (<), najpierw nastąpi obliczenie odpowiednich sum, czyli wyrażenie zredukuje się do postaci 3<3. Jest to nierówność ostra, która nie jest spełniona, zatem wynik tego wyrażenia to fałsz, przekazany do print jako napis pusty. Wypisanie tego napisu oczywiście nie będzie miało żadnego widocznego efektu, ale sama instrukcja print wykona się, wbrew temu, co pisali niektórzy. Można to sprawdzić, pisząc choćby perl -le 'print print 1+2<0+3'.
  5. Jak ustawić szósty bit w zmiennej $a, równej początkowo 12? Opisz dowolny sposób i podaj końcową wartość zmiennej w systemie dziesiętnym.
    To zadanie okazało się prawdziwym mieczem Damoklesaurl dla większości studentów. A operacja jest naprawdę trywialna! Podstawą jest to, że bity w typowej reprezentacji bitowej numerujemy zawsze od zera. Zatem 20 to pierwszy bit, a 21 to drugi bit. 22 to trzeci bit, itd. Bit szósty, to 25, co dziesiętnie jest równe 32 (zgodnie z intuicją grupy) :) Kolejna sprawa: w zadaniu chodzi o ustawienie bitu. Oznacza to, że ten bit ma uzyskać wartość 1, i to w taki sposób, aby żaden inny bit w zmiennej nie uległ zmianie. Jest to bardzo proste, jeżeli korzysta się z operatorów bitowych, i o takie zastosowanie chodzi w tym zadaniu. Rozwiązaniem jest: $a = $a | 32; Oczywiście, zapis skrócony to $a|=32; albo nawet $a|=1<<5; (działa dzięki priorytetom operatorów poprawnie), chociaż ten ostatni zapis raczej dla typowego studenta nie wygląda przyjaźnie. Wypisanie zmiennej $a pokaże, że dziesiętnie ma ona wartość 44. Perl pozwala także zobaczyć reprezentację bitową zmiennej, bez potrzeby wykonywania konwersji własnoręcznie. Wystarczy wykorzystać formatowane wyjście, i użyć printf z formantem %b ("procent be"): $a = 12; printf "%b",$a | 32; Uwaga: zadania, w których zastosowano nieprawidłową metodę, to znaczy stosowano flagę bitową o wartości 64 (26 - ustawiony siódmy bit), nie były zaliczane. Podobnie jakiekolwiek inne usterki - eliminowały zadanie, i już. Najwyższy czas już wiedzieć takie proste rzeczy :P
  6. Zadanie dodatkowe (tak, to Wasze ulubione... postanowiłem spróbować): napisz dowolne pytanie dotyczące operatorów perla i odpowiedz na nie. Odpowiedź może zostać uznana, jeżeli obejmuje odpowiedni zakres materiału i jest prawidłowa.
    Tutaj sytuacja wygląda tak, że naprawdę można było zadać sobie jakieś mniej lub bardziej mądre pytanie, i następnie odpowiedzieć (prawidłowo lub nie). Jeżeli zadanie było ciekawe i odpowiedź sensowna, można było uzyskać dodatkowy punkt. Oto przykładowe zadania, jakie niektóre osoby postanowiły sobie zadać:
    1. Czemu polecenie '$a=1; $b=2; $c=3, ($a?$b:$c) print $a' wypisze 2?
      Nie wypisze. Błąd jest w samym pytaniu... w miejscu, gdzie stoi operator warunkowy a potem print. Ale brawa za odwagę i ciekawą koncepcję.
    2. Co się stanie? for('a'..'zzzzz'){if($_ -e){ unlink($_) } }
      Pojawi się błąd składni, związany z zapisem $_ -e. Prawidłowo linia ta mogłaby wyglądać tak: for('a'..'zzzzz'){ unlink if -e }. Polecenie oczywiście ma za zadanie wykasować wszystkie pliki z aktualnego katalogu, których nazwy mają postać 'a', 'b', 'c', .... 'zzzzx', 'zzzzy', 'zzzzz'. Ciekawy przykład i oparty o kilka mechanizmów które warto znać.
    3. Czym się różni || od OR?
      Wszystkim. Najpierw tym że inaczej się je pisze, potem, że || to w perlu operator, a OR to dwuznakowy napis niecytowany, którego perl nie rozpoznaje. Gdyby chodziło o or, to na to pytanie udzielono prawidłowej odpowiedzi: priorytet operatora || jest większy od operatora or. Powoduje to, że akcje typu: unlink "plik" || die "Nie mogę usunąć!" są przez perla interpretowane jakby były napisane tak: unlink ("plik" || die "Nie mogę usunąć!") co jest oczywiście nie tym, o co chodziło... W takiej sytuacji należy stosować operator który ma niższy priorytet niż jednoargumentowny operator nazwany, jakim jest tutaj unlink, czyli operator or.
    4. Jaki jest wynik działania perl -le 'print if 5 .. 10' plik.txt
      Żaden. Wbrew marzeniom autora, nic nie zostanie wypisane, a szkoda. Zabrakło w tym przykładzie opcji -n... Niemniej, to dobry przykład pytania i poruszenie ciekawego tematu.
    5. ... inne pytania nie nadają się za bardzo do zacytowania, gdyż są trywialne lub okraszone poczuciem humoru, za którym często, niestety, nie szła konkretna wiedza... :)

Zadania dla grupy 2

  1. Wyjaśnij jak działa operator postinkrementacji.
    Operator ten ma postać ++ postawionych z prawej strony zmiennej skalarnej (czyli pojedynczej). Przykładem zapisu może być np. $a++, $b[10]++, itp. Działanie tego operatora polega na tym, że zwiększa on wartość zmiennej, a wartością wyrażenia ($a++) jest poprzednia wartość zmiennej. Innymi słowy, najpierw zwracana jest wartość, a potem zmienna jest zwiększana. Zatem wartość wyrażenia z tym operatorem to po prostu stara wartość zmiennej, ale efekt uboczny jest taki, że zmienna jest potem o jeden większa. Przydaje się to wtedy, gdy chcemy mieć dostęp do starej wartości zmiennej, a po jej uzyskaniu zmienną chcemy zwiększyć (wbrew pozorom często taka sytuacja jest). Przykłady: $a = 1; $a++; # wartość $a wynosi 2 $a = 1; $b = 0; $b = $a++; # wartość $b wynosi 1, wartość $a wynosi 2 W przypadku, gdy w danym wyrażeniu kilkakrotnie występuje operator postinkrementacji w odniesieniu do tej samej zmiennej, wynik wyrażenia (jak podano w dokumentacji perla) pozostaje niezdefiniowany. Aby ułatwić sobie analizę takich wyrażeń należy przyjąć, że operator -- zwraca wartość (powtarzam: wartość) zmiennej, którą następnie zmniejsza. Jest to odróżnienie od operatorów pre-, które zmieniają wprawdzie wartość, ale zwracają referencję do zmiennej, a nie wartość. Ma to oczywiście skutki. Na przykład: $a = 0; $b = $a++ + $a++; wartością zmiennej $b będzie... 1. I jest to prawidłowe zachowanie. Operator + dwuargumentowy najpierw oblicza swój lewy argument, w którym stoi $a++. Ponieważ zmienna ma wartość zero, taka wartość zostanie zwrócona do operatora +. Po lewej stronie zatem otrzymamy zero, a po prawej, operator ++ będzie inkrementował już zmienioną zmienną $a, która w tym momencie będzie wynosiła 1. Inkrementacja nastąpi jednak po zwróceniu wartości, zatem po prawej stronie otrzymamy jedynkę, a następnie wartość $a zostanie zwiększona do 2. Można to sprawdzić następującym prostym kodem perla (patrz rys. 3):
    wynik dzialania $a++
    Rys. 3. Działanie operatora postinkrementacji. Drugie wykonanie dodatkowo wypisuje wartość zmiennej $a, i widać, że wynosi ona 2.
  2. Wyjaśnij dlaczego dwa poniżej przedstawione programy wydają się działać dokładnie tak samo (to znaczy - pozornie nic nie robią): perl -le '$x=2;$y=2; print $x=2 < $y' perl -le '$x=2;$y=2; print $x=2 > $y'
    Szczegółowe wyjaśnienie zostało podane przy omawianiu tego zadania dla grupy 1. Znajdziesz je tutaj. W tym przypadku jedynie wartości zmiennych nieco się różnią, zaś wyrażenia redukują się do postaci: $x=2;$y=2; print $x = 2 < 2; i dalej wykonywany jest print "". W drugim przypadku mamy $x=2;$y=2; print $x = 2 > 2 i podobnie jest to redukowane do polecenia wypisującego napis pusty. Wszystkie zasady i metoda analizy wyrażenia pozostają poza tym bez zmian.
  3. Dlaczego wynik działania polecenia print (1+1)/2 wynosi 2?
    Dlatego, że print zostało wywołane jako funkcja, i obliczane będize najpierw, powodując wypisanie sumy 1+1, która jest równa 2. Szczegóły analizy działania tego kodu wyjaśniłem powyżej, zobacz tutaj.
  4. Polecenie print 3-3>2-2; nic nie wypisuje. Wyjaśnij przyczynę.
    Przyczyna jest dokładnie taka sama, jak wyjaśniono tutaj. Ten konkretny przykład redukuje się do wyrażenia print 0>0, i w efekcie zostanie wypisany napis pusty.
  5. Jak usunąć siódmy (było błędnie: szósty) bit w zmiennej $a, równej początkowo 65? Opisz dowolny sposób i podaj końcową wartość zmiennej w systemie dziesiętnym.
    Zacząć należy od tego, że określenie "usunąć" bit oznacza ustawienie jego wartości na 0, niezależnie od innych bitów w zmiennej. Usuwanie bitu najczęściej wykonywane jest poprzez wykorzystanie operatora bitowego 'and' na zanegowanej fladze bitowej, którą zerujemy. Operator ten wygląda jak pojedynczy znak &. Negację wykonać możemy za pomocą operatora podobnego do falki ~ (bitowe not). Tutaj również, podobnie jak we wszystkich innych przypadkach pamiętać należy, że bity numeruje się od zera! Dokładniejsze wyjaśnienie jest tutaj, natomiast ten konkretny przypadek można rozwiązać tak: $a = 65; $wynik = $a & ~64; Co ciekawe, zanegowane bitowo 64 ma wartość 18446744073709551551 (w systemie 64-bitowym! Wartość dla systemu 32-bitowego to 4294967231) i takiej liczby możemy także użyć do wykonania operacji and: $wynik = $a & 18446744073709551551; # $wynik ma wartość 1 Tak się składa że wartość -65 także ma wyzerowany 7 bit, a wszystkie pozostałe bity ustawione na 1, zatem i tej wartości możemy użyć do zerowania flagi: $wynik = $a & -65... co prowadzi wręcz do wyrażenia 64 & -65 ... które wygląda dość... zastanawiająco. Możliwe są także inne kombinacje prowadzące do opisanego wyniku, sprowadzają się one jednak do tego, co powyżej.
  6. Zadanie dodatkowe (tak, to Wasze ulubione... postanowiłem spróbować): napisz dowolne pytanie dotyczące operatorów perla i odpowiedz na nie. Odpowiedź może zostać uznana, jeżeli obejmuje odpowiedni zakres materiału i jest prawidłowa.
    Kilka przykładów jest tutaj.

Zadania dla grupy 3

  1. Wyjaśnij, jak działa operator preinkrementacji.
    Preinkrementacja ma podobne działanie do predekrementacji, opisanej szczegółowo tutaj, z tym, że efektem jej działania jest zwiększenie wartości o 1, a sam operator powinien stać przed modyfikowaną zmienną: ++$a. Wartością wyrażenia (++$a) jest referencja do zmiennej $a dająca aktualną wartość zmiennej. Dlatego w przypadkach, gdy operator ten występuje kilkukrotnie w jednym wyrażeniu działając na tę samą zmienną, należy pamiętać, że każda modyfikacja zmiennej staje się widoczna od razu we wszystkich miejscach. Przykład: $a = 0; $b = ++$a + ++$a;Wartość $b będzie równa 4, dlatego, że w pierwszym kroku obliczony zostaje lewy argument +, czyli (++$a) (co jest równe 1, ale zwracane do + jest przez referencję), a następnie prawy argument, który odpowiada inkrementacji zmiennej $a równej początkowo 1 (i czego wynikiem jest 2). W momencie gdy drugi argument plusa zostaje obliczony, następuje sumowanie, ale argumenty dane przez referecję do $a wynoszą 2 (oba!), i stąd suma jest równa 4.
  2. Wyjaśnij dlaczego dwa poniżej przedstawione programy wydają się działać dokładnie tak samo (to znaczy - pozornie nic nie robią): perl -le '$q=5;$p=5; print $q=5 < $p' perl -le '$q=5;$p=5; print $q=5 > $p'
    Zostało to wyjaśnione i przedyskutowane tutaj. W tym przykładzie wyrażenia redukują się do postaci $q = 5 < 5 oraz $q = 5 > 5. I podobnie jak w poprzednio opisanych przypadkach, wypisanie wartości $q powoduje wypisanie pustego napisu, który jest wynikiem porównania wpisanym do zmiennej $q.
  3. Dlaczego wynikiem działania polecenia print (1+2)*2 jest 3?
    Z tego samego względu, co w poprzednio omówionych zadaniach. Zobacz tutaj. W tym przykładzie chodzi o to, że print jest przez perla traktowany jak funkcja, a funkcja zawsze pobiera swoje argumenty wyłącznie z nawiasów.
  4. Wynikiem działania wyrażenia 1+2<3+4 jest 1. Wyjaśnij dlaczego.
    Wyrażenie to redukuje się do postaci 3 < 7 (ze względu na to, że dwuargumentowy operator sumy arytmetycznej ma wyższy priorytet niż operator relacji). Wynikiem jest prawda, reprezentowana w postaci liczby 1.
  5. Jak zamienić wszystkie bity (o wartości 1) zmiennej $a = 254; na bity o wartości 0 i odwrotnie (przykład: 0010 ma się zmienić w 1101)? Podaj nową wartość zmiennej $a.
    Aby zmienić odpowiadające sobie bity na bity przeciwne, a więc 1 na 0, i 0 na 1, należy użyć operatora negacji logicznej. Operator ten ma w perlu postać falki (tylda) ~. Zastosowanie może być takie: $a = 254; $b = ~$a; Wartością tak zanegowanej zmiennej $a jest liczba 18446744073709551361 (znowu - w systemie 64-bitowym, gdzie wielkość standardowego słowa maszyny to 8 bajtów, czyli 64 bity). Na mancie, gdzie wykonywaliście to zadanie, wartość ta wyniesie 4294967041, gdyż manta jest maszyną 32-bitową i rozmiar słowa maszynowego ma o połowę mniejszy. Gdyby jednakże ograniczyć przestrzeń adresową do 8 bitów (jak w pierwszych mikrokomputerach osobistych - spektrum, atari... ktoś pamięta?), to wynikiem takiego działania byłoby po prostu 1. Bardzo chamskim sposobem byłaby zamiana liczby na tekst reprezentujący jej wartość binarną, i następnie zamiana wszystkich 1 na zero, a zero na 1, i ponowna zamiana na liczbę. Jest to absolutnie niewydajne, i ma tylko taki efekt, że unikamy odwracania wszystkich bitów 'wysokich', powyżej granicy słowa 8-bitowego. Kod, który robi takie przestawienie oczywiście wykracza poza omówione do tej pory mechanizmy, ale może wyglądać np. tak: print eval "0b".(($a=sprintf "%08b",254)=$a=~tr/10/01/) Oczywiście aby "obciąć" bity, które wykraczają poza granicę 8 bitów w naszym przypadku tak naprawdę należy wykonać operację bitowego and z ośmioma bitami: print ~254 ∧ 255; To, podobnie jak poprzedni przykład zwróci dokładnie wartość 1. I w odpowiedzi można było podać że wyjdzie 1, przy założeniu, że operujemy na 8 bitach jednego bajtu. Nikt jednak nie zrobił tego zadania poprawnie...
  6. Zadanie dodatkowe (tak, to Wasze ulubione... postanowiłem spróbować): napisz dowolne pytanie dotyczące operatorów perla i odpowiedz na nie. Odpowiedź może zostać uznana, jeżeli obejmuje odpowiedni zakres materiału i jest prawidłowa.
    Zobacz tutaj.

Zadania dla grupy 4

  1. Wyjaśnij, jak działa operator postdekrementacji.
    Jego działanie opisałem tutaj.
  2. Wyjaśnij dlaczego dwa poniżej przedstawione programy wydają się działać dokładnie tak samo (to znaczy - pozornie nic nie robią): perl -le '$s=0;$v=0; print $s=0 < $v' perl -le '$s=0;$v=0; print $s=0 > $v'
    Jest to wyjaśnione przy odpowiedzi do zadania z pierwszej grupy, które różniło się jedynie nazwami zmiennych i wartościami liczbowymi. Zobacz tutaj.
  3. Dlaczego wynikiem działania polecenia print (2-1)/2 jest 1?
    To także zostało już wyjaśnione, patrz wyżej.
  4. Jak to możliwe, że po wykonaniu polecenia print +(1+2<=0)+3 pojawia się 3? Odpowiedź uzasadnij.
    Dyskusja tego zadania jest wcześniej na tej stronie. W tym konkretnym przypadku wyrażenie redukuje się do postaci pośredniej +(3<=0)+3, co dalej jest obliczane jako +(0)+3. Wynika to oczywiście z priorytetu operatorów.
  5. Jak przesunąć najmniej znaczący jeden bit w zmiennej $a = 10; o jedną pozycję w kierunku bitów bardziej znaczących? (Dla jasności: przed operacją taki bit stoi np. w szyku 0010, a po operacji ma zająć pozycję 0100. Uwaga - wszystkie pozostałe bity muszą zostać bez zmian).
    Można wykorzystać operator xor bitowego (mający postać daszka ^, bitowa różnica symetryczna), ale trzeba wiedzieć, z jaką wartością flagi bitowej należy xorować zmienną. Innym rozwiązaniem jest wykonanie najpierw wyzerowania bitu, a następnie ustawienia bitu w odpowiedniej pozycji. W obu przypadkach efekt jest taki sam. Oto rozwiązania, przy założeniu, że operujemy na zmiennej, która ma wielkość jednego bajtu, czyli 8 bitów: $a = 10; $b = $a ^ 0b0110; Albo druga wersja: $a = 10; $b = $a & ~0b10; $b = $b | 0b100; Oto postać wyników po ich rzeczywistym wykonaniu (rys. 4):
    wyniki operacji bitowych
    Rys. 4. Wyniki operacji bitowych, przesuwających wybrany bit.
    Oczywiście zapis 0b01010101 to zapis liczby binarnej, czyli liczby w systemie dwójkowym. Napis "%b" to w funkcji printf formatowanie liczb pozwalające wypisać je w postaci binarnej. Bardzo wygodne.
  6. Zadanie dodatkowe (tak, to Wasze ulubione... postanowiłem spróbować): napisz dowolne pytanie dotyczące operatorów perla i odpowiedz na nie. Odpowiedź może zostać uznana, jeżeli obejmuje odpowiedni zakres materiału i jest prawidłowa.
    Nie było zbyt wielu propozycji, niektóre jednak pozwoliłem sobie zacytować. Zobacz tutaj.

Uwaga. Jeżeli na tej stronie znalazłeś błąd, lub znasz lepsze wyjaśnienia zadań, proszę, napisz do mnie na adres manty.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Kolokwia
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.