A bitenkénti művelet a programozásban egy bitláncokon végzett művelet , általában ebbe az osztályba tartoznak a logikai bitenkénti műveletek és a biteltolások . A programozási nyelvekben és a digitális technológiában használják , diszkrét matematikában tanulmányozzák .
A bitműveletek a digitális jelfeldolgozás alapját képezik : ezek segítségével a bemeneten egy vagy több jelből új jelet kapunk, amely egy vagy több ilyen művelet bemenetére táplálható. A bitműveletek tárolóelemekkel (például triggerekkel ) kombinálva valósítják meg a modern digitális technológia lehetőségeinek minden gazdagságát.
Az alacsony szintű nyelveken számos forrás a bitenkénti logikai műveleteket egyszerűen logikainak nevezi [1] [2] , de a magas szintű nyelvek programozásának terminológiájában a bitenkénti műveletek nevei bitenkénti , bitenkénti mellékneveket tartalmaznak (például: „bitenkénti logikai ÉS ”, ez is „bitenkénti szorzás”), bitenkénti .
Egyes programozási nyelvekben a logikai és bitenkénti logikai műveleteknek megfelelő operátorok nevei hasonlóak. Ezenkívül a programozási nyelv lehetővé teheti a numerikus típusok implicit konverzióját logikai típussá és fordítva. Az ilyen programozási nyelvekben ügyelni kell a logikai és bitenkénti műveletek használatára, amelyek keverése hibákhoz vezethet. Például a C++ nyelvben a "2 && 1" ( logikai ÉS ) kifejezés eredménye a true logikai érték , a "2 & 1" ( bitenkénti ÉS ) kifejezés eredménye pedig a 0 egész érték .
A bitenkénti negáció (vagy bitenkénti NEM , komplementer ) egy unáris művelet , amelynek művelete egyenértékű azzal, hogyaz operandus bináris reprezentációjának minden bitjére logikai negációt alkalmazunk. Más szóval, azon a helyen, ahol az operandus bináris reprezentációjában 0 volt, az eredmény 1 lesz, és fordítva, ahol 1 volt, ott 0 lesz. Például:
NEM | 01 |
tíz |
A bitenkénti „ÉS” egy bináris művelet , amelynek művelete egyenértékű azzal, hogy logikai „ÉS”-t alkalmazunk minden olyan bitpárra, amelyek az operandusok bináris megjelenítésében azonos pozícióban vannak. Más szóval, ha az operandusok mindkét megfelelő bitje 1, az eredményül kapott bit 1; ha a pár legalább egy bitje 0, az eredményül kapott bit 0.
Példa:
És | 0011 |
0101 | |
0001 |
A bitenkénti VAGY egy bináris művelet, amely egyenértékű azzal, hogy logikai VAGY -ot alkalmazunk minden olyan bitpárra, amelyek azonos pozícióval rendelkeznek az operandusok bináris megjelenítésében. Más szóval, ha az operandusok mindkét megfelelő bitje 0, az eredmény bináris bitje 0; ha a pár legalább egy bitje 1, akkor az eredmény bináris bitje 1.
Példa:
VAGY | 0011 |
0101 | |
0111 |
A bitenkénti exkluzív VAGY (modulo 2 addíció) egy bináris művelet, amelynek működése egyenértékű azzal, hogy minden egyes bitpárra logikai exkluzív VAGY -ot alkalmazunk , amelyek azonos pozícióban vannak az operandusok bináris megjelenítésében. Más szóval, ha az operandusok mindkét megfelelő bitje egyenlő egymással, az eredmény bináris bitje 0; ellenkező esetben az eredmény bináris számjegye 1.
Példa:
Excl. VAGY | 0011 |
0101 | |
0110 |
A művelet első orosz neve annak a ténynek köszönhető, hogy ennek a műveletnek az eredménye a 4 bemeneti esetből csak egy esetben tér el az "OR" eredményétől - mindkettő 1 (az argumentumok egyidejű igazságának esete "kizárt" "). Még az orosz nyelvtanban is ennek a logikai kapcsolónak a jelentését a „vagy” unió közvetíti.
A második név az, ami valóban összeadás a modulo two maradékok gyűrűjében , amiből néhány érdekes tulajdonság következik. Például a fenti „ÉS” és „VAGY”-tól eltérően ez a művelet visszafordítható: .
A számítógépes grafikában az "addition modulo two" kifejezést használják, amikor sprite -okat jelenítenek meg a képen - ismételt alkalmazása eltávolítja a sprite-ot a képről. Az involutivitás miatt ugyanaz a művelet talált alkalmazásra a kriptográfiában, mint egy abszolút biztonságos titkosítás ( Vernam cipher ) legegyszerűbb megvalósítása. A "Modulo two addíció" két változó cseréjére is használható az XOR cserealgoritmus segítségével .
Ezt a műveletet „maszk inverziónak” is nevezhetjük, vagyis a maszk 1-jével megegyező biteket az eredeti bináris számból invertáljuk.
Az általános programozási nyelvekben csak négy bitenkénti logikai műveletet valósítanak meg a beépített eszközök: ÉS, VAGY, NEM és XOR . Egy tetszőleges bitenkénti logikai művelet megadásához a felsoroltak bőven elegendőek, sőt, ahogy a Boole-függvények elméletéből következik, az alapműveletek még kisebb halmazára szorítkozhatunk. Vannak olyan programozási nyelvek is, amelyekben beépített lehetőség van bármilyen bináris logikai művelet bitenkénti végrehajtására. Például a PL/I -nek van egy beépített BOOL függvénye, amelynek harmadik argumentuma egy tetszőleges logikai művelet megadása, amelyet bitenként kell alkalmazni az első két argumentumra [3] .
A bitenkénti műveletek biteltolásokat is tartalmaznak. Eltoláskor a bitértékek átmásolódnak a szomszédos értékekre az eltolás irányában. Az extrém bitek feldolgozásától függően többféle eltolás létezik - logikai , aritmetikai és ciklikus .
Létezik továbbá balra (a legkisebb jelentőségű bittől a legjelentősebbig) és jobbra (a legjelentősebb bittől a legkisebb jelentőségűig) történő eltolás is.
A logikai eltolás során az utolsó bit értéke az eltolás irányában elvész (átmásolódik a hordozóbitre), és az első bit nullává válik.
Az aritmetikai eltolás hasonló a logikai eltoláshoz, de a szám előjeles számnak minősül, amelyet egy kiegészítő kódban ábrázolnak. Tehát jobbra tolással a legjelentősebb bit megtartja értékét. A balra történő aritmetikai eltolás megegyezik a logikaival.
Az aritmetikai bal és jobb eltolás a gyors szorzáshoz és 2-vel való osztáshoz használható.
A forgatás során az utolsó bit értéke az eltolás irányában az első bitre kerül (és a hordozóbitre).
Létezik ciklikus eltolás is a hordozóbiten keresztül - amelyben az eltolás irányába eső első bit a hordozóbittől kapja az értéket, az utolsó bit értéke pedig a hordozóbitbe tolódik el.
Beépített operátorok és függvények, amelyek bitenkénti logikai műveleteket valósítanak meg bizonyos programozási nyelvekben:
Nyelv | NEM | És | VAGY | Excl. VAGY | Váltás balra | váltson jobbra | Egyéb |
---|---|---|---|---|---|---|---|
C , C++ , Java [4] , C# , Ruby , Python , JavaScript | ~ | & | | | ^ | << | >> | |
Pascal [5] | nem | és | vagy | xor | shl | shr | |
Kotlin [6] | inv | ||||||
PL/1 [7] | ÉN NEM | ÉN ÉS | ÉN VAGY | IEOR | BOOL | ||
¬ | & | | | ¬ | ||||
Prológus [8] | \ | /\ | \/ |
Egy végtelen (kettős komplementerben) bináris regiszterbe írt egész szám a p-adikus számok elméletének természetes objektuma . A 2-adikus egész számok halmaza (vagyis tetszőleges végtelen bitsorozatok) Boole-algebraként tekinthető, akárcsak egy véges hosszúságú bitregiszter értékkészlete. A fenti bitenkénti műveletek mindegyike folyamatos leképezésnek bizonyul . Bár a gyakorlati programozás nem rendelkezik végtelen hosszúságú regiszterekkel, ez nem akadályozza meg ennek az elméleti ténynek a kriptográfiában való felhasználását nagy sebességű titkosítási algoritmusok létrehozására.
A bitműveletek megvalósítása elvileg bármilyen lehet: mechanikus (beleértve a hidraulikus és pneumatikus), kémiai, termikus, [9] elektromos, mágneses és elektromágneses (tartományok - IR, látható optikai, UV, és tovább a hullámhosszok csökkenő sorrendjében ), valamint kombinációk formájában, például elektromechanikus .
A 20. század első felében, a tranzisztorok feltalálása előtt , elektromechanikus reléket és vákuumcsöveket használtak .
Tűz- és robbanásveszélyes körülmények között továbbra is pneumatikus logikai eszközöket (pneumonikot) használnak.
A tranzisztorokat használó bitműveletek leggyakoribb elektronikus megvalósításai , például ellenállás-tranzisztor logika (RTL), dióda-tranzisztor logika (DTL), emitter-csatolt logika (ECL), tranzisztor-tranzisztor logika (TTL), N-MOS logika , CMOS -logika stb.
A kvantumszámítástechnikában a felsorolt Boole-műveletek közül csak NEM és nem. VAGY (némi fenntartással). Az ÉS, VAGY stb.-nek nincsenek kvantumanalógjai.
A VAGY-NEM vagy VAGY művelet eredménye egy bináris regiszter összes bitjén ellenőrzi, hogy a regiszter értéke nulla-e; ugyanaz, a kilépésből átvéve, kivéve VAGY két regiszterből ellenőrzi értékük egyenlőségét egymás között.
A bitműveleteket karaktergenerátorokban és grafikus adapterekben használják .
A processzor aritmetikai logikai egységében ( ALU ) való megvalósítás révén sok regiszterbites művelet elérhető a hardverben alacsony szintű nyelveken . A legtöbb processzor egy regisztert NEM utasításként valósít meg; regiszter kétargumentumú ÉS, VAGY, XOR; nulla egyenlőség-ellenőrzés (lásd fent); háromféle biteltolás, valamint ciklikus biteltolódás.
Az ÉS regiszter művelet a következőkre szolgál:
A regiszter VAGY művelet a következőkre szolgál:
A regiszter XOR művelete egy maszkkal ellátott regiszter bitjeinek invertálására szolgál.
A balra és jobbra történő eltolás a 2-vel való szorzásra, az egész szám 2-vel való osztása, valamint az egyes bitek kivonására szolgál.
Így például az internetes hálózati technológiákban az IP-cím értéke és az alhálózati maszk értéke közötti ÉS műveletet használják annak meghatározására, hogy egy adott cím egy alhálózathoz tartozik-e.