Bitin toiminta

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 16. joulukuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 10 muokkausta .

Bittikohtainen operaatio ohjelmoinnissa on  operaatio bittiketjuilla , pääsääntöisesti loogiset bittioperaatiot ja bittisiirrot sisältyvät tähän luokkaan . Niitä käytetään ohjelmointikielissä ja digitaalisessa tekniikassa , opiskellaan diskreetissä matematiikassa .

Bittioperaatiot ovat digitaalisen signaalinkäsittelyn perusta : niiden avulla yhdestä tai useammasta sisääntulon signaalista saadaan uusi signaali, joka puolestaan ​​voidaan syöttää yhden tai useamman tällaisen toiminnon sisäänmenoon. Juuri bittioperaatiot yhdessä tallennuselementtien (esimerkiksi triggerien ) kanssa toteuttavat nykyaikaisen digitaalitekniikan kaiken mahdollisuuksien rikkauden.

Bittikohtaiset operaatiot

Monet lähteet matalan tason kielillä kutsuvat bittikohtaisia ​​loogisia operaatioita yksinkertaisesti loogisiksi [1] [2] , mutta korkean tason kielten ohjelmoinnin terminologiassa bittikohtaisten toimintojen nimet sisältävät adjektiiveja bittikohtaisesti , bittikohtaisesti (esim. "bittinen looginen AND ", se on myös "bittinen kertolasku"), bittikohtainen .

Joissakin ohjelmointikielissä loogisia ja bittikohtaisia ​​loogisia operaatioita vastaavien operaattorien nimet ovat samanlaiset. Lisäksi ohjelmointikieli voi sallia numeerisen tyypin implisiittisen muuntamisen boolen tyypiksi ja päinvastoin. Tällaisissa ohjelmointikielissä tulee olla varovainen loogisten ja bittikohtaisten operaatioiden käytössä, joiden sekoittaminen voi johtaa virheisiin. Esimerkiksi C++ :ssa lausekkeen "2 && 1" ( looginen AND ) tulos on totuusarvo tosi , ja lausekkeen "2 & 1" ( bittisesti AND ) tulos on kokonaislukuarvo 0 .

Bittikohtainen negaatio

Bitittainen negaatio (tai bittikohtainen EI , komplementti ) on unaarinen operaatio, jonka toiminta vastaa loogisen negation soveltamista operandin binääriesityksen jokaiseen bittiin. Toisin sanoen, kohdassa, jossa operandin binääriesityksessä oli 0, tulos on 1, ja päinvastoin, missä oli 1, on 0. Esimerkki:

EI 01
kymmenen

Bitwise AND

Bitittainen "AND"  on binääritoiminto , jonka toiminta vastaa loogisen "AND" :n soveltamista jokaiseen bittipariin, joka on samoissa paikoissa operandien binääriesityksissä. Toisin sanoen, jos operandien molemmat vastaavat bitit ovat 1, tuloksena oleva bitti on 1; jos ainakin yksi parin bitti on 0, tuloksena oleva bitti on 0.

Esimerkki:

Ja 0011
0101
0001

Bitwise TAI

Bitittainen TAI  on binääritoiminto, joka vastaa loogisen TAI :n soveltamista jokaiseen bittipariin, jolla on sama paikka operandien binääriesityksissä. Toisin sanoen, jos operandien molemmat vastaavat bitit ovat 0, tuloksen binääribitti on 0; jos ainakin yksi parin bitti on 1, tuloksen binääribitti on 1.

Esimerkki:

TAI 0011
0101
0111

Bitwise XOR

Bittikohtainen poissulkeva TAI (modulo 2 additio) on binääritoiminto, jonka toiminta vastaa loogisen poissulkevan TAI :n soveltamista jokaiseen bittipariin, jotka ovat samoissa paikoissa operandien binääriesityksissä. Toisin sanoen, jos operandien molemmat vastaavat bitit ovat keskenään yhtä suuret, tuloksen binääribitti on 0; muussa tapauksessa tuloksen binääriluku on 1.

Esimerkki:

Ei sisällä TAI 0011
0101
0110

Operaation ensimmäinen venäläinen nimi johtuu siitä, että tämän operaation tulos eroaa "OR" -tuloksesta vain yhdessä tapauksessa neljästä syöttötapauksesta - molemmat 1 (argumenttien samanaikaisen totuuden tapaus "suljetaan pois "). Jopa venäjän kielioppissa tämän loogisen konnektiivin merkitys välittyy liitolla "tai".

Toinen nimi on se, joka on todella lisäys jäännösrenkaassa modulo kaksi, josta seuraa mielenkiintoisia ominaisuuksia. Esimerkiksi toisin kuin yllä olevat "AND" ja "OR", tämä toiminto on peruutettavissa: .

Tietokonegrafiikassa "addition modulo two" käytetään spriten näyttämisessä kuvassa - sen toistuva sovellus poistaa spriten kuvasta. Involutiivisuudesta johtuen sama operaatio on löytänyt sovelluksen kryptografiassa kuin ehdottoman turvallisen salauksen yksinkertaisin toteutus ( Vernam cipher ). "Modulo kaksi lisäystä" voidaan myös käyttää kahden muuttujan vaihtamiseen käyttämällä XOR-vaihtoalgoritmia .

Tätä toimintoa voidaan myös kutsua "maskin inversioksi", eli bitit, jotka vastaavat maskin ykköstä, käännetään alkuperäisestä binääriluvusta.

Yleisissä ohjelmointikielissä vain neljä bittikohtaista loogista toimintoa toteutetaan sisäänrakennetuilla työkaluilla: AND, OR, NOT ja XOR . Mielivaltaisen bittikohtaisen loogisen operaation määrittämiseksi luetellut riittävät, ja lisäksi, kuten Boolen funktioiden teoriasta seuraa, voidaan rajoittua vielä pienempään joukkoon perusoperaatioita. On myös ohjelmointikieliä, joissa on sisäänrakennettu kyky suorittaa mikä tahansa binaarinen looginen toiminto bitti kerrallaan. Esimerkiksi PL/I :ssä on sisäänrakennettu BOOL-funktio, jonka kolmas argumentti on mielivaltaisen loogisen toiminnon määrittäminen, jota sovelletaan bittikohtaisesti kahteen ensimmäiseen argumenttiin [3] .

Bittisiirrot

Bittikohtaiset operaatiot sisältävät myös bittisiirrot. Siirrettäessä bittiarvot kopioidaan vierekkäisiin siirron suuntaan. Siirtymiä on useita tyyppejä - loogisia , aritmeettisia ja syklisiä , riippuen ääribittien käsittelystä.

On myös siirtymä vasemmalle (suunnassa vähiten merkitsevästä bitistä merkittävimpään) ja oikealle (suuntaan eniten merkitsevästä bitistä vähiten merkitsevään).

Looginen siirto

Loogisen siirron aikana siirron suunnan viimeisen bitin arvo katoaa (kopioi siirtobitille) ja ensimmäisestä bitistä tulee nolla.

Aritmeettinen muutos

Aritmeettinen siirto on samanlainen kuin looginen siirto, mutta numeroa pidetään etumerkittynä numerona, joka esitetään lisäkoodissa. Joten oikealle siirrettäessä merkittävin bitti säilyttää arvonsa. Vasemmanpuoleinen aritmeettinen siirto on identtinen loogisen siirron kanssa.

Aritmeettisia siirtoja vasemmalle ja oikealle käytetään nopeaan kertomiseen ja kahdella jakamiseen.

Syklinen vaihto

Rotaation aikana viimeisen bitin arvo siirron suunnassa kopioidaan ensimmäiselle bitille (ja kopioidaan siirtobitille).

On myös syklinen siirto siirtobitin kautta  - jossa ensimmäinen bitti siirron suunnassa saa arvon siirtobitiltä ja viimeisen bitin arvo siirtyy siirtobitille.

Ohjelmointikielillä

Sisäänrakennetut operaattorit ja funktiot, jotka toteuttavat bittikohtaisia ​​loogisia operaatioita joissakin ohjelmointikielissä:

Kieli EI Ja TAI Ei sisällä TAI Vaihto vasemmalle vaihtaa oikealle muu
C , C++ , Java [4] , C# , Ruby , Python , JavaScript ~ & | ^ << >>
Pascal [5] ei ja tai xor shl shr
Kotlin [6] lasku
PL/1 [7] EI MINÄ JA IOR IEOR BOOL
¬ & | ¬
Prologi [8] \ /\ \/

2-adic tulkinta

Kokonaisluku, joka on kirjoitettu (kahden komplementissa) äärettömään (kahden positiivisten potenssien suuntaan) binäärirekisteriin on luonnollinen kohde p-adic-lukujen teorialle . 2-adic kokonaislukujen joukkoa (eli mielivaltaisia ​​äärettömiä bittisarjoja) voidaan tarkastella Boolen algebrana, aivan kuten äärellisen pituisen bittirekisterin arvojoukkoa. Kaikki edellä mainitut bittikohtaiset toiminnot osoittautuvat jatkuviksi kuvauksiksi . Vaikka käytännön ohjelmoinnissa ei ole äärettömän pituisia rekistereitä, tämä ei estä tämän teoreettisen tosiasian käyttöä kryptografiassa nopeiden salausalgoritmien luomiseen.

Käytännön sovellukset

Bittitoimintojen fyysinen toteutus

Bittitoimintojen toteutus voi periaatteessa olla mikä tahansa: mekaaninen (mukaan lukien hydraulinen ja pneumaattinen), kemiallinen, terminen, [9] sähköinen, magneettinen ja sähkömagneettinen (alueet - IR, näkyvä optinen, UV ja edelleen aallonpituuksien mukaan laskevassa järjestyksessä ), sekä yhdistelmien muodossa, esimerkiksi sähkömekaanisena .

1900-luvun ensimmäisellä puoliskolla , ennen transistorien keksimistä, käytettiin sähkömekaanisia releitä ja tyhjiöputkia .

Tulipalossa ja räjähdysvaarallisissa olosuhteissa käytetään edelleen pneumaattisia logiikkalaitteita (pneumoniikka).

Yleisimmät transistoreilla käytettävien bittitoimintojen elektroniset toteutukset , esimerkiksi vastus-transistorilogiikka (RTL), diodi-transistorilogiikka (DTL), emitterikytkentälogiikka (ECL), transistori-transistorilogiikka (TTL), N-MOS- logiikka , CMOS -logiikka jne.

Kvanttilaskennassa luetelluista Boolen operaatioista vain EI ja pl. TAI (joillakin varauksilla). AND:lle, OR:lle jne. ei ole kvanttianalogeja.

Laitteiston logiikkakaaviot

OR-NOT- tai OR-operaation tulos binäärirekisterin kaikilla biteillä tarkistaa, onko rekisterin arvo nolla; sama, otettu poistumisesta ilman TAI kahdesta rekisteristä, tarkistaa arvojensa samanarvoisuuden keskenään.

Bittitoimintoja käytetään merkkigeneraattoreissa ja grafiikkasovittimissa .

Käytä ohjelmoinnissa

Prosessorin aritmeettisen logiikkayksikön ( ALU ) toteutuksen ansiosta monet rekisteribittitoiminnot ovat saatavilla laitteistossa matalan tason kielillä . Useimmat prosessorit toteuttavat rekisteriä EI käskynä; rekisteröi kaksi argumenttia JA, TAI, XOR; nollatasa-arvo (katso edellä); kolmenlaisia ​​bittisiirtoja sekä syklisiä bittisiirtoja.

AND-rekisteritoimintoa käytetään:

Rekisteri TAI -toimintoa käytetään:

Rekisterin XOR-operaatiota käytetään rekisterin bittien kääntämiseen maskilla.

Vasemman ja oikean siirtoa käytetään kertomiseen 2:lla ja kokonaisluvun jakamiseen 2:lla sekä yksittäisten bittien erottamiseen.

Joten esimerkiksi Internet-verkkoteknologioissa IP-osoitteen arvon ja aliverkon peitteen arvon välistä JA-operaatiota käytetään määrittämään, kuuluuko tietty osoite aliverkkoon.

Muistiinpanot

  1. 8086-mikroprosessorin kokoonpanokieli . Haettu 19. tammikuuta 2010. Arkistoitu alkuperäisestä 26. tammikuuta 2013.
  2. Kerto- ja jakolasku // Turbo Assembler ohjelmointijärjestelmän käsikirja / Toim. S. B. Orlova.
  3. PL/I Language Reference Arkistoitu 25. syyskuuta 2018 Wayback Machinessa  - s. 393
  4. Java-kielen määritys. Kokonaislukutoiminnot . Käyttöpäivä: 17. tammikuuta 2010. Arkistoitu alkuperäisestä 28. helmikuuta 2012.
  5. Free Pascal: Viiteopas. Loogiset operaattorit . Haettu 20. toukokuuta 2018. Arkistoitu alkuperäisestä 21. toukokuuta 2018.
  6. Perustyypit - Kotlin-ohjelmointikieli . Kotlin. Haettu 2. tammikuuta 2017. Arkistoitu alkuperäisestä 2. tammikuuta 2017.
  7. PL/I-kieliviite . Haettu 17. tammikuuta 2010. Arkistoitu alkuperäisestä 25. syyskuuta 2018.
  8. GNU-Prolog Manual. Aritmetiikka . Käyttöpäivä: 18. tammikuuta 2010. Arkistoitu alkuperäisestä 23. tammikuuta 2010.
  9. ↑ Lämpötietokoneen logiikkaportti on luotu  // Lenta.ru . - Ongelma. 05.11.2007 _