búlovské operaceTakéLogické operace, Boolean operators, Booleova algebraZákladní

Definice

Booleovské operace jsou logické operace nad hodnotami pravda a nepravda, především AND (konjunkce), OR (disjunkce), NOT (negace) a XOR (nonekvivalence). Tvoří základ Booleovy algebry, řídí podmínky v programovacím kódu, filtry ve vyhledávání i klauzuli WHERE v SQL a na úrovni hardwaru je realizují logická hradla procesoru.

Kategorie: Softwarový vývojAktualizováno

Nezaměňujte: V programování a logice jde o operace nad hodnotami pravda/nepravda, zatímco ve 3D modelování a vektorové grafice označuje stejný termín sjednocení, průnik a rozdíl geometrických tvarů.

Čtyři operace, ze kterých se dá poskládat všechno

Booleovské operace pracují s dvouhodnotovou logikou: každý vstup i výstup je buď pravda (true, 1), nebo nepravda (false, 0). Základní čtveřici tvoří AND, OR, NOT a XOR. AND vrací pravdu jen tehdy, když platí oba vstupy. OR vrací pravdu, když platí alespoň jeden. NOT hodnotu obrací. XOR (výlučné nebo) vrací pravdu, když se vstupy liší.

Chování se zapisuje pravdivostní tabulkou:

ABA AND BA OR BA XOR B
00000
01011
10011
11110

Kombinace NAND (negované AND) sama o sobě stačí k sestavení libovolné jiné operace, což je důvod, proč se z hradel NAND dají stavět celé procesory.

Proč každý programátor narazí na De Morganovy zákony

Negace složené podmínky se často píše špatně. De Morganovy zákony říkají, že NOT (A AND B) se rovná (NOT A) OR (NOT B) a naopak NOT (A OR B) se rovná (NOT A) AND (NOT B). Při přepisu podmínky se tedy AND mění na OR, ne jen tak, že se před závorku připíše vykřičník. Právě tady vzniká většina chyb v refaktorovaných podmínkách.

Zkrácené vyhodnocování

Většina jazyků vyhodnocuje logické výrazy zleva doprava a zastaví se, jakmile je výsledek jistý. U a && b() se b() nezavolá, když je a nepravda. To se využívá jako pojistka: user != null && user.isAdmin(). Zároveň to znamená, že pravá strana výrazu může mít vedlejší efekty, které se někdy neprovedou.

Bitové varianty

Vedle logických operací existují bitové (&, |, ^, ~), které aplikují stejnou tabulku na každý bit čísla zvlášť. Používají se pro příznakové masky, oprávnění nebo rychlé výpočty. Bitové operátory nezkracují vyhodnocení, protože musí spočítat obě strany.

Kde se Booleovské operace objevují v praxi

Podmínky if a cykly ve zdrojovém kódu jsou nejviditelnější použití. V SQL řídí klauzuli WHERE a rozhodují, které řádky projdou filtrem; pozor na to, že SQL pracuje s trojhodnotovou logikou, kde NULL vytváří třetí stav „neznámo“. Fulltextové vyhledávače nabízejí booleovské dotazy typu marketing AND (SEO OR PPC) NOT junior. Ve 3D modelování se stejné názvy používají pro operace nad tělesy: sjednocení, průnik a rozdíl dvou objektů. A v grafických editorech se booleovské operace aplikují na tvary a masky.

Sdílený princip je vždy stejný: rozhodnutí se skládá z jednodušších rozhodnutí podle přesně definovaných pravidel, která se dají ověřit tabulkou.

Příklady z praxe

  1. Kontrola oprávnění pomocí bitové masky

    Aplikace ukládá oprávnění uživatele do jednoho čísla, kde každý bit znamená jedno právo. Test se dělá bitovým AND, přidání práva bitovým OR. Osm oprávnění se tak vejde do jediného bajtu a kontrola je jedna instrukce procesoru.

    const READ = 0b001, WRITE = 0b010, DELETE = 0b100;
    let perms = READ | WRITE;      // 0b011
    
    if (perms & WRITE) console.log("může zapisovat");
    if (perms & DELETE) console.log("nevypíše se");
    
    perms = perms | DELETE;        // přidání práva
    perms = perms & ~WRITE;        // odebrání práva
  2. Filtr objednávek v SQL a past na NULL

    Dotaz má vrátit zaplacené objednávky nad tisíc korun, které nejsou stornované. Podmínka se skládá z AND a OR, přičemž závorky jsou nutné, protože AND má vyšší prioritu než OR. Sloupec s hodnotou NULL ve srovnání nikdy nevrátí pravdu, takže se musí testovat operátorem IS NOT NULL.

    SELECT id, total
    FROM orders
    WHERE (status = 'paid' OR status = 'shipped')
      AND total > 1000
      AND cancelled_at IS NULL;

Časté omyly

MýtusNegaci podmínky udělám tak, že před ni dám vykřičník a nechám AND, jak bylo.
Ve skutečnostiNegace složeného výrazu podle De Morganových zákonů prohazuje AND za OR. Z NOT (A AND B) vznikne (NOT A) OR (NOT B), nikoli (NOT A) AND (NOT B).
MýtusV SQL je každá podmínka buď pravda, nebo nepravda.
Ve skutečnostiSQL používá trojhodnotovou logiku s hodnotou UNKNOWN. Porovnání s NULL nevrací ani pravdu, ani nepravdu, takže řádek filtrem neprojde a NOT takový výsledek nepřeklopí na pravdu.
MýtusOperátory && a & dělají v podstatě totéž, jen se jinak píšou.
Ve skutečnostiLogický operátor pracuje s celou pravdivostní hodnotou a zkracuje vyhodnocení, bitový operátor zpracovává jednotlivé bity čísla a vždy vyhodnotí obě strany včetně vedlejších efektů.

Časté dotazy

Jaká je priorita operátorů AND, OR a NOT?
Priorita Booleovských operátorů je ve většině jazyků i v SQL stejná: nejvyšší má NOT, pak AND a nakonec OR. Výraz A OR B AND C se tedy vyhodnotí jako A OR (B AND C), což je zdroj tichých chyb v dotazech i podmínkách. Doporučený postup je psát závorky explicitně všude, kde se AND a OR míchají, i když by je jazyk sám doplnil stejně. Čtenář kódu pak nemusí prioritu držet v hlavě a code review je rychlejší.
K čemu se v praxi hodí operace XOR?
XOR se v praxi používá tam, kde je potřeba zjistit rozdíl. Slouží k jednoduchému šifrování a maskování dat, k výpočtu paritních bitů a kontrolních součtů, v RAID polích k dopočítání ztracených dat z ostatních disků a v hashovacích funkcích k míchání bitů. Užitečná vlastnost je, že XOR je sám sobě inverzní: aplikováním stejného klíče podruhé se získá původní hodnota. V podmínkách se XOR objevuje zřídka, protože zápis A != B bývá čitelnější.
Proč se místo booleovské hodnoty používají v JavaScriptu truthy a falsy hodnoty?
Dynamické jazyky jako JavaScript nebo Python převádějí libovolnou hodnotu na pravdivostní kontext automaticky. V JavaScriptu jsou falsy hodnoty false, 0, prázdný řetězec, null, undefined a NaN, všechno ostatní je truthy. Praktický důsledek je, že podmínka if (pocet) se nechová stejně jako if (pocet !== undefined), protože nula projde jako nepravda. Pro obranu proti tomu existují operátory jako nullish coalescing, které reagují pouze na null a undefined, nikoli na nulu nebo prázdný řetězec.
Odkud pochází název Booleovské operace?
Název Booleovské operace odkazuje na anglického matematika George Boolea, který v polovině 19. století popsal algebraický systém pro práci s logickými výroky. Praktický význam pro techniku dodal ve 30. letech 20. století Claude Shannon, když ukázal, že Booleova algebra popisuje chování reléových a spínacích obvodů. Od té doby stojí na stejném základu logická hradla, procesory i podmínky v programovacích jazycích. Datový typ boolean nese jméno po stejném matematikovi.

Zdroje

  1. Expressions and operators(otevře se v novém okně)MDN Web Docs
  2. Logical Operators(otevře se v novém okně)PostgreSQL Global Development Group
  3. Boolean algebra(otevře se v novém okně)Wikipedia
  4. Built-in Types(otevře se v novém okně)Python Software Foundation

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.