Tässä opetusohjelmassa opit kaikista 6 b-operaattorista C-ohjelmoinnissa esimerkkien avulla.
Aritmeettis-logiikkayksikössä (joka on CPU: n sisällä) matemaattiset operaatiot, kuten: yhteenlasku, vähennyslasku, kertolasku ja jako, suoritetaan bittitasolla. Bittitason operaatioiden suorittamiseksi C-ohjelmoinnissa käytetään bittikohtaisia operaattoreita.
Operaattorit | Operaattoreiden merkitys |
---|---|
& | Bittikohtaisesti JA |
| | Bittiä TAI |
^ | Bitteittäin XOR |
~ | Bittikohtainen täydennys |
<< | Vaihda vasemmalle |
>> | Vaihda oikealle |
Bittikohtaisesti JA operaattori &
Bittiviivan AND lähtö on 1, jos kahden operandin vastaavat bitit ovat 1. Jos operandin jompikumpi bitti on 0, vastaavan bitin tulos arvioidaan 0: ksi.
Oletetaan kahden kokonaisluvun 12 ja 25 bittikohtainen toiminta.
12 = 00001100 (binaarina) 25 = 00011001 (binaarina) 12- ja 25-bittitoiminta 00001100 & 00011001 ________ 00001000 = 8 (desimaalina)
Esimerkki # 1: Bitteittäin JA
#include int main() ( int a = 12, b = 25; printf("Output = %d", a&b); return 0; )
Tuotos
Lähtö = 8
Bittitason TAI-operaattori |
Bittien OR lähtö on 1, jos ainakin yksi vastaava bitti kahdesta operandista on 1. C-ohjelmoinnissa bittitunnusta TAI-operaattoria merkitään |.
12 = 00001100 (binaarina) 25 = 00011001 (binaarina) bittiä TAI 12: n ja 25: n toiminta 00001100 | 00011001 ________ 00011101 = 29 (desimaalilla)
Esimerkki # 2: bittiä TAI
#include int main() ( int a = 12, b = 25; printf("Output = %d", a|b); return 0; )
Tuotos
Tuotos = 29
Bittikohtainen XOR (yksinomainen TAI) -operaattori ^
Bittikohtaisen XOR-operaattorin tulos on 1, jos kahden operandin vastaavat bitit ovat vastakkaisia. Sitä merkitään ^.
12 = 00001100 (binäärimuodossa) 25 = 00011001 (binäärimuodossa) 12: n ja 25: n bittinen XOR-operaatio 00001100 00011001 ________ 00010101 = 21 (desimaalina)
Esimerkki # 3: bittiä kohti XOR
#include int main() ( int a = 12, b = 25; printf("Output = %d", a^b); return 0; )
Tuotos
Tuotos = 21
Bittikohtainen operaattori ~
Bittikohtainen kohteliaisuusoperaattori on unaarinen operaattori (toimii vain yhdellä operandilla). Se muuttuu 1: stä 0: een ja 0: sta 1. Sitä merkitään ~.
35 = 00100011 (binäärimuodossa) Täydennetään bittikohtaisesti arvoa 35 ~ 00100011 ________ 11011100 = 220 (desimaalina)
Kierrä C-ohjelmoinnissa bittiä täydentävä operaattori
35 (~ 35) bittikommentti on -36 220: n sijaan, mutta miksi?
Minkä tahansa kokonaisluvun n kohdalla n: n bittikommentti on -(n+1)
. Tämän ymmärtämiseksi sinulla on oltava tieto 2: n täydennyksestä.
2: n täydennysosa
Kahden komplementti on operaatio binääriluvuilla. Luvun 2 komplementti on yhtä suuri kuin luvun + 1 komplementti. Esimerkiksi:
Desimaali Binaarinen 2: n komplementti 0 00000000 - (11111111 + 1) = -00000000 = -0 (desimaali) 1 00000001 - (11111110 + 1) = -11111111 = -256 (desimaali) 12 00001100 - (11110011 + 1) = -11110100 = -244 (desimaali) 220 11011100 - (00100011 + 1) = -00100100 = -36 (desimaali) Huom: Ylivuoto jätetään huomiotta laskettaessa 2: n komplementtia.
35: n bittikommentti on 220 (desimaalilla). 2: n komplementti 220: sta on -36. Siksi lähtö on -36 220: n sijaan.
Minkä tahansa luvun N bittikommentti on - (N + 1). Näin:
bitin N = ~ N komplementti (edustettuna 2: n komplementtimuodossa) 2'-komplementti ~ N = - (~ (~ N) +1) = - (N + 1)
Esimerkki # 4: Täydennetään bittiä kohti
#include int main() ( printf("Output = %d",~35); printf("Output = %d",~-12); return 0; )
Tuotos
Lähtö = -36 Lähtö = 11
Vaihto-operaattorit C-ohjelmoinnissa
C-ohjelmoinnissa on kaksi vuoro-operaattoria:
- Oikean vaiheen operaattori
- Vasemman vaiheen operaattori.
Oikea vaihde
Oikean siirtymän operaattori siirtää kaikki bitit oikealle tietyllä määrällä määritettyjä bittejä. Sitä merkitään >>.
212 = 11010100 (binäärisenä) 212 >> 2 = 00110101 (binäärisenä) (Oikea siirtymä kahdella bitillä) 212 >> 7 = 00000001 (binäärisenä) 212 >> 8 = 00000000212 >> 0 = 11010100 (ei siirtoa)
Vasemman vaiheen operaattori
Vasemman vaiheen operaattori siirtää kaikki bitit vasemmalle tietyllä määrällä määritettyjä bittejä. Vasemman siirto-operaattorin vapauttamat bittiasennot täytetään arvolla 0. Vasemman siirto-operaattorin symboli on <<.
212 = 11010100 (binäärisenä) 212 << 1 = 110101000 (binäärisenä) (Vasen siirtymä yhdellä bitillä) 212 << 0 = 11010100 (Vaihto 0: lla) 212 << 4 = 110101000000 (binäärisenä) = 3392 (desimaalilla) )
Esimerkki # 5: Vaihto-operaattorit
#include int main() ( int num=212, i; for (i=0; i>i); printf(""); for (i=0; i<=2; ++i) printf("Left shift by %d: %d", i, num<
Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848