11.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M EAND OR XOR NOTa b a & b a | b a ^ b ~a0 0 0 0 0 10 1 0 1 1 11 0 0 1 1 01 1 1 1 0 0Tab. 1System.out.println(“a & b = “ + c);Výstupom tohto programu bude èíslo 2216, hexadecimálne 0x08A8, ktoré je <strong>sk</strong>utoènevýsledkom logického súèinu hodnôt 0x3CA8 a 0xCAFE, o èom sa môžeme ¾ahkopresvedèi prepísaním hodnôt premenných a a b a výsledku c do dvojkovej sústavy.Argumentmi operátora & môžu by okrem celoèíselných hodnôt èi premenných aj premennéa hodnoty typu boolean. Tie, ako vieme, sú široké len jeden bit. Logický súèin sarealizuje <strong>na</strong>d týmto jediným bitom a výsledky sú v zhode s tabu¾kou 1, len s týmrozdielom, že <strong>na</strong>miesto èíselných hodnôt 0 a 1 uvažujeme pri logických premennýchliterály false a true. O tom ostatne svedèí <strong>na</strong>sledujúci úsek programu:System.out.println(“true & false = “ + (true & false));ktorého výstupom bude, pochopite¾ne, literál false.Operátor bitového logického súètu | realizuje výpoèet logického súètu jednotlivýchbitov svojich dvoch operandov. Opä ide o binárny operátor s asociáciou z¾ava doprava.Použitie ukážeme <strong>na</strong> modifikácii predchádzajúceho príkladu:int a = 0x3CA8;int b = 0xCAFE;int c = a | b;System.out.println(“a | b = “ + c);Tentoraz je výstupom hodnota 65278, hexadecimálne 0xFEFE. O správnosti výsledku saopätovne možno presvedèi prepisom hodnôt do dvojkovej sústavy.Aj operátor | dokáže spracova logické premenné typu boolean. Výstupom <strong>na</strong>sledujúcehoriadka:System.out.println(“true | false = “ + (true | false));,je teda literál true.Operátor bitového exkluzívneho logického súètu ^ nás už iste nièím neprekvapí. Slúži<strong>na</strong> výpoèet funkcie XOR, ktorá <strong>na</strong> rozdiel od funkcie OR (tzv. inkluzívneho logickéhosúètu) vyluèuje súèasnú platnos oboch svojich argumentov. (To je ostatne jediný bod, vktorom sa XOR líši od OR.) Aj tento operátor je binárny a asociuje sa z¾ava doprava.Obligátny príklad:int a = 0x3CA8;int b = 0xCAFE;int c = a ^ b;System.out.println(“a ^ b = “ + c);Program po<strong>sk</strong>ytne výsledok 63062, hexadecimálne 0xF656.Ani operátor ^ nám neodoprie možnos aplikova ho <strong>na</strong> hodnoty typu boolean:System.out.println(“true ^ true = “ + (true ^ true));Ako uvidíme po spustení, exkluzívnym logickým súètom dvoch hodnôt true je presnepod¾a predpokladov hodnota false.Operátor bitovej negácie ~ <strong>na</strong>š astie trochu <strong>na</strong>rúša doterajší stereotyp. Ako vyplýva zpovahy negácie, tento operátor bude unárny a asociova sa bude podobne ako inéunárne operátory sprava do¾ava. Aplikova ho však môžeme výhradne <strong>na</strong> premennéceloèíselného typu:int a = 0x3CA8;int b = ~a;System.out.println(“~a = “ + b);Výstupom bude bitová negácia hodnoty 0x3CA8, èo je dekadicky –15529 (typ int je z<strong>na</strong>mienkový,spomí<strong>na</strong>te si?) a hexadecimálne 0xFFFFC357 (pretože typ int má šírku 32 bitov).Ve¾ký pozor si treba da pri pokuse o negáciu premenných typu boolean. V takom prípadetotiž nemožno použi operátor bitovej negácie ~. Naš astie Java je v tomto smereoh¾aduplná a ako náhradu ponúka operátor logickej negácie !. Pre tento operátor i<strong>na</strong>kplatí všetko, èo sme uviedli o operátore ~. Ešte krátky príklad:System.out.println(“!true = “ + !true);Ako sa môžeme presvedèi , negáciou hodnoty true je (prekvapujúco :) hodnota false.V Jave podobne ako v C++ existujú okrem bitových operátorov logického súèinu & alogického súètu | ešte iné dva logické operátory && a ||, realizujúce <strong>na</strong> poh¾ad rov<strong>na</strong>kélogické funkcie. Oba operátory sú binárne a asociujú sa z¾ava doprava, ich operandy všakmusia by typu boolean. Okrem toho sa operátory && a || líšia od svojich jednoz<strong>na</strong>kovýchnáprotivkov v pomerne zásadnej veci: spomeòme si, že operandy operátora sav Jave vyhodnocujú vždy z¾ava doprava. Ak sa však ¾avý operand operátora && vyhodnotíako false, výsledok už nemôže by iný ako false, preto sa pravý operand ani nevyhodnocuje.Podobne operátor ||: ak má jeho ¾avý operand hodnotu true, výsledok budeza každých okolností true a pravý operand sa nevyhodnotí.Na demonštráciu uvedených vlastností operátorov && a || slúži <strong>na</strong>sledujúci príklad:int i = 10;boolean never = false;boolean r1 = (i < 0) && (never = true);boolean r2 = (i > 0) || (never = true);System.out.println(“r1 = “ + r1 + “, r2 = “ + r2);System.out.println(“never = “ + never);Výstup programu:r1 = false, r2 = truenever = falsenám potvrdí, že pri vyhodnocovaní výrazov priraïujúcich hodnoty premenným r1 a r2sú výsledky známe už po vyhodnotení príslušných podmienok a k priradeniu true dopremennej never nikdy nedôjde.Èitate¾ ovládajúci C++ si azda v súvislosti s operátorom && všimne zásadný rozdielmedzi C++ a Javou. V C++ môžu by operandy && ¾ubovo¾ného èíselného typu. Zobermesi teda <strong>na</strong>príklad èísla 5 a 10. Výraz 5 && 10 je vyhodnotený ako pravdivý (jeho hodnotaje 1), zatia¾ èo výraz 5 & 10 je vyhodnotený ako 0, pretože oba operandy majú spodnéštyri bity „<strong>na</strong> pre<strong>sk</strong>áèku“ (0101 a 1010). V Jave operandy && môžu by iba typuboolean a výsledok aplikácie operátora && bude rov<strong>na</strong>ký ako výsledok aplikácie &,rozdiel je len v prípadnom <strong>sk</strong>rátenom vyhodnocovaní. Zatia¾ èo teda v C++ je potrebnépodmienky re azi operátorom && (ako <strong>na</strong>pr. a >= 100 && a < 200), v Jave môžemepouži aj operátor &. Pozor treba da iba <strong>na</strong> to, aby výsledok aplikácie & bol typuboolean, pretože podmienkové výrazy v príkazoch if, while a pod. musia by výhradnetypu boolean.Praktická aplikácia bitových operátorovBitové operátory &, | a ^ možno s úspechom použi pri manipulácii s jednotlivými bitmiceloèíselných premenných. V praxi sa obyèajne vy<strong>sk</strong>ytne potreba vybrané bity urèitej premennej<strong>na</strong>stavi , vynulova alebo preklopi do opaèného stavu. Ostatné bity by sme radiponechali v pôvodnom stave. Riešenie tejto úlohy je pomerne jednoduché, staèí dobreovláda vlastnosti logických funkcií.Pre <strong>na</strong>stavenie vybraných bitov s úspechom využijeme funkciu logického súètu OR.Ako vyplýva z tabu¾ky jej funkèných hodnôt (tab. 1), logický súèet s jednotkovým bitomje vždy jednotka, logický súèet s nulovým bitom pôvodný bit nemení. Ako druhý operandoperátora | teda použijeme èíslo, v ktorom sú jednotkové tie bity, ktoré chceme <strong>na</strong>stavi ,a nulové všetky ostatné. Príklad:byte b = 0x29;System.out.println(“b | 0x07 = “ + (b | 0x07));Chceme <strong>na</strong>stavi spodné tri bity, použijeme teda èíslo 0x07. Výsledok bude pod¾a oèakávaniaèíslo 0x2F (resp. 47 dekadicky).Na nulovanie vybraných bitov sa hodí funkcia logického súèinu AND. Logický súèin¾ubovo¾nej hodnoty s nulou je vždy nula, logický súèin s jednotkou pôvodný bit zachová.Tentoraz teda použijeme ako druhý operand operátora & èíslo, v ktorom sú nulové tiebity, ktoré potrebujeme vynulova ; ostatné bity zadáme jednotkové. Príklad:byte b = 0x29;System.out.println(“b & 0xF8 = “ + (b | 0xF8));Tentoraz chceme vynulova spodné tri bity, vhodným operandom bude èíslo 0xF8.Výsledkom je hodnota 0x28 alebo dekadicky 40.Koneène negáciu vybraných bitov realizujeme pomocou funkcie exkluzívneho logickéhosúètu XOR. Tá má tú vlastnos , že ak XORujeme ¾ubovo¾ný bit s jednotkou, výsledkomje presne opaèná hodnota. Nula pôvodný bit nemení. Operand operátora ^ vytvorímerov<strong>na</strong>kým spôsobom ako pri <strong>na</strong>stavovaní bitov. Príklad:byte b = 0x29;System.out.println(“b ^ 0x07 = “ + (b ^ 0x07));Opätovne použijeme èíslo 0x07, výsledkom negácie spodných troch bitov hodnoty 0x29bude èíslo 0x2E, dekadicky 46.Èíslo, ktoré používame ako druhý operand operátorov &, | a ^, sa <strong>na</strong>zýva ma<strong>sk</strong>a. Je vhodnéuloži si ma<strong>sk</strong>u do samostatnej premennej (prípadne konštantnej premennej – uvidímene<strong>sk</strong>ôr, ako ju deklarujeme). Potom ju môžeme používa ve¾mi elegantným spôsobom:fi<strong>na</strong>l byte MASK = 0x07;b = b | MASK; // <strong>na</strong>stavenie124 PC REVUE 12/2000

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!