Bitová operace v programování je operace s řetězci bitů , do této třídy jsou zpravidla zahrnuty logické bitové operace a bitové posuny . Používají se v programovacích jazycích a digitální technologii , studují se v diskrétní matematice .
Bitové operace jsou základem digitálního zpracování signálu : pomocí nich se získá nový signál z jednoho nebo více signálů na vstupu, který může být zase přiveden na vstup jedné nebo více takových operací. Právě bitové operace v kombinaci s paměťovými prvky (například spouštěči ) realizují veškeré bohatství možností moderní digitální technologie.
Řada zdrojů o jazycích nižší úrovně nazývá bitové logické operace jednoduše logické [1] [2] , ale v terminologii programování v jazycích vyšší úrovně obsahují názvy bitových operací přídavná jména bitwise , bitwise (například: „bitové logické AND “, je to také „bitové násobení“), bitové .
V některých programovacích jazycích jsou názvy operátorů odpovídajících logickým a bitovým logickým operacím podobné. Kromě toho může programovací jazyk umožňovat implicitní převod numerického typu na booleovský typ a naopak. V takových programovacích jazycích je třeba dávat pozor na používání logických a bitových operací, jejichž míchání může vést k chybám. Například v C++ je výsledkem výrazu "2 && 1" ( logický AND ) logická hodnota true a výsledkem výrazu "2 & 1" ( bitový AND ) je celočíselná hodnota 0 .
Bitová negace (nebo bitová NEgace , doplněk ) je unární operace, jejíž akce je ekvivalentní aplikaci logické negace na každý bit binární reprezentace operandu. Jinými slovy, na pozici, kde byla v binární reprezentaci operandu 0, bude výsledek 1, a naopak, kde byla 1, bude 0. Například:
NE | 01 |
deset |
Bitové "AND" je binární operace , jejíž akce je ekvivalentní aplikaci logického "AND" na každý pár bitů, které jsou na stejných pozicích v binárních reprezentacích operandů. Jinými slovy, pokud jsou oba odpovídající bity operandů 1, výsledný bit je 1; pokud je alespoň jeden bit z páru 0, výsledný bit je 0.
Příklad:
A | 0011 |
0101 | |
0001 |
Bitový OR je binární operace, která je ekvivalentní aplikaci logického OR na každý pár bitů, které mají stejnou pozici v binárních reprezentacích operandů. Jinými slovy, pokud jsou oba odpovídající bity operandů 0, binární bit výsledku je 0; pokud je alespoň jeden bit z páru 1, binární bit výsledku je 1.
Příklad:
NEBO | 0011 |
0101 | |
0111 |
Bitový exkluzivní OR (modulo 2 sčítání) je binární operace, jejíž akce je ekvivalentní aplikaci logického výlučného OR na každý pár bitů, které jsou na stejných pozicích v binárních reprezentacích operandů. Jinými slovy, pokud jsou oba odpovídající bity operandů navzájem stejné, binární bit výsledku je 0; jinak je binární číslice výsledku 1.
Příklad:
Vyjma NEBO | 0011 |
0101 | |
0110 |
První ruský název operace je způsoben tím, že výsledek této operace se liší od výsledku "OR" pouze v jednom případě ze 4 vstupních případů - oba 1 (případ současné pravdivosti argumentů je "vyloučen" "). I v ruské gramatice je význam tohoto logického spojovacího výrazu zprostředkován spojením „nebo“.
Druhý název je ten, který je ve skutečnosti sčítáním v kruhu zbytků modulo dva, z čehož plynou některé zajímavé vlastnosti. Například na rozdíl od výše uvedených "AND" a "OR" je tato operace vratná: .
V počítačové grafice se při zobrazování skřítků na obrázku používá "addition modulo two" - jeho opakovaná aplikace skřítka z obrázku odstraní. Díky involutivitě našla stejná operace uplatnění v kryptografii jako nejjednodušší implementace absolutně bezpečné šifry ( Vernamova šifra ). "Modulo two add" lze také použít k výměně dvou proměnných pomocí XOR výměnného algoritmu .
Tuto operaci lze také nazvat "inverze masky", to znamená, že bity, které odpovídají 1 v masce, jsou invertovány z původního binárního čísla.
V běžných programovacích jazycích jsou vestavěnými nástroji implementovány pouze čtyři bitové logické operace: AND, OR, NOT a XOR . Pro specifikaci libovolné bitové logické operace stačí ty uvedené a navíc, jak vyplývá z teorie booleovských funkcí, lze se omezit na ještě menší množinu základních operací. Existují také programovací jazyky, kde je vestavěna schopnost provádět jakoukoli binární logickou operaci bit po bitu. Například PL/I má vestavěnou funkci BOOL, jejíž třetí argument je pro specifikaci libovolné logické operace, která se má bitově aplikovat na první dva argumenty [3] .
Bitové operace také zahrnují bitové posuny. Při posunu se bitové hodnoty zkopírují do sousedních ve směru posunu. Existuje několik typů posunů - logické , aritmetické a cyklické , v závislosti na zpracování krajních bitů.
Dochází také k posunu doleva (ve směru od nejméně významného bitu k nejvýznamnějšímu) a doprava (ve směru od nejvýznamnějšího bitu k nejméně významnému).
Během logického posunu se hodnota posledního bitu ve směru posunu ztratí (zkopíruje se do bitu přenosu) a první bit se stane nulou.
Aritmetický posun je podobný logickému posunu, ale číslo je považováno za číslo se znaménkem, zastoupené v doplňkovém kódu. Takže s posunutím doprava si nejvýznamnější bit zachová svou hodnotu. Levý aritmetický posun je shodný s logickým.
Aritmetické posuny doleva a doprava se používají pro rychlé násobení a dělení 2.
Při rotaci se hodnota posledního bitu ve směru posunu zkopíruje do prvního bitu (a zkopíruje se do bitu přenosu).
Dochází také k cyklickému posunu přes bit přenosu - ve kterém první bit ve směru posunu přijímá hodnotu z bitu přenosu a hodnota posledního bitu je posunuta do bitu přenosu.
Vestavěné operátory a funkce, které implementují bitové logické operace v některých programovacích jazycích:
Jazyk | NE | A | NEBO | Vyjma NEBO | Shift doleva | posunout doprava | jiný |
---|---|---|---|---|---|---|---|
C , C++ , Java [4] , C# , Ruby , Python , JavaScript | ~ | & | | | ^ | << | >> | |
Pascal [5] | ne | a | nebo | xor | shl | shr | |
Kotlin [6] | inv | ||||||
PL/1 [7] | JÁ NE | IAND | IOR | IEOR | BOOL | ||
¬ | & | | | ¬ | ||||
Prolog [8] | \ | /\ | \/ |
Celé číslo zapsané (ve dvojkovém doplňku) v nekonečném (ve směru kladných mocnin dvojky) binárním registru je přirozeným objektem pro teorii p-adických čísel pro . Na sadu 2-adických celých čísel (to znamená libovolné nekonečné bitové sekvence) lze pohlížet jako na booleovskou algebru, stejně jako na sadu hodnot bitového registru konečné délky. Všechny výše uvedené bitové operace se ukáží jako spojitá zobrazení . Přestože praktické programování nemá registry nekonečné délky, nebrání to využití této teoretické skutečnosti v kryptografii k vytvoření vysokorychlostních šifrovacích algoritmů.
Provádění bitových operací může být v zásadě libovolné: mechanické (včetně hydraulických a pneumatických), chemické, tepelné, [9] elektrické, magnetické a elektromagnetické (rozsahy - IR, viditelné optické, UV a dále v sestupném pořadí vlnových délek ), stejně jako ve formě kombinací, například elektromechanické .
V první polovině 20. století, před vynálezem tranzistorů , se používaly elektromechanická relé a elektronky .
V požárních a výbušných podmínkách se stále používají pneumatická logická zařízení (pneumonika).
Nejběžnější elektronické implementace bitových operací pomocí tranzistorů , například logika rezistoru a tranzistoru (RTL), logika dioda-tranzistor (DTL), logika s emitorem (ECL), logika tranzistor-tranzistor (TTL), logika N-MOS , logika CMOS atd.
V kvantovém počítání z uvedených booleovských operací pouze NOT a bez. NEBO (s určitými výhradami). Neexistují žádné kvantové analogy AND, OR atd.
Výsledek operace OR-NOT nebo OR na všech bitech binárního registru zkontroluje, zda je hodnota registru nula; totéž, převzato z východu bez. NEBO dvou registrů kontroluje rovnost jejich hodnot mezi sebou.
Bitové operace se používají v generátorech znaků a grafických adaptérech .
Díky implementaci v aritmetické logické jednotce ( ALU ) procesoru je v hardwaru k dispozici mnoho bitových operací registru v nízkoúrovňových jazycích . Většina procesorů implementuje registr NOT jako instrukci; registr dvouargumentů AND, OR, XOR; kontrola nulové rovnosti (viz výše); tři typy bitových posunů, stejně jako cyklické bitové posuny.
Operace registru AND se používá k:
Operace registru OR se používá k:
Operace registru XOR se používá k invertování bitů registru s maskou.
Posuny vlevo a vpravo se používají pro násobení 2 a dělení celého čísla 2 a extrahování jednotlivých bitů.
Takže například v internetových síťových technologiích se operace AND mezi hodnotou IP adresy a hodnotou masky podsítě používá k určení, zda daná adresa patří do podsítě.