BITTIOPERAATIOT

Bittoperaattorit toimivat bitti kerrallaan, joten muuttujan arvoa kokonaisuudessaan ei käsitellä. Operaattorien olemassaolo mahdollistaa C-kielen käytön laiteajurien ja käyttöjärjestelmien ohjelmointiin. Bittioperaattorit antavat kielelle koneläheisten kielten piirteitä. Bittioperaattoreiden käyttö vaatii binäärisen lukujärjestelmän ja muistijärjestelmän ymmärtämisen. Sovellusohjelmien ohjelmointi ei välttämättä vaadi bittioperaattoreiden käyttöä mutta niiden avulla voidaan ohjelmien tehokkuutta parantaa.


LOOGISET BITTITASON OPERAATTORIT

Bittitason loogisia operaattoreita on käytössä neljä. Nämä operaattorit käyttävät kokonaislukutiedon binääristä esitysmuotoa, joten niiden avulla voidaan muokata muistin ja muuttujien sisäisiä bittejä.

Bittitason loogiset operaattorit:

Operaattori Tarkoitus
& AND eli JA
| OR eli TAI
^ XOR eli poissulkeva TAI
~ 1:den komplementti
<< Bittien siirto vasemmalle
>> Bittien siirto oikealle
&= AND ja sijoitus
^= XOR ja sijoitus
<<= Bittien siirto vasemmalle ja sijoitus
>>= Bittien siirto oikealle ja sijoitus


Kukin bittitason looginen operaattori suorittaa bitti-bitiltä -operaation sisäiselle tiedolle. Bittitason operaattoreille soveltuvat char, int ja long -tyyppiset muuttujat ja vakiot, mutta ei liukulukutyyppinen tieto.


BITTITASON AND ( & )

Operaattoria & kutsutaan nimellä bittitason AND-operaatio. AND tulosbitti on ykkönen, ainoastaan mikäli molemmat operandibiteistä on ykkösiä. Bittitason operaattoria & (AND) käytetään testaamaan, onko molemmat operandien bitit ykkösiä.

Bittitason AND-totuustaulu ( & )
1.bitti AND 2.bitti Tulos
1 & 1 1
1 & 0 0
0 & 1 0
0 & 0 0

Bittitason totuustauluissa voidaan korvata ykkönen sanalla Tosi ja nolla sanalla Epätosi, jolloin molempien bittien on oltava Tosi jotta tulos olisi Tosi.

Rakenne:

Bittitason & (AND) yhdistää kaksi muuttujaa bitti bitiltä:

muuttuja_1 = muuttuja_2 & muuttuja_3;

Tuloksena on muuttuja, joka on kahden muuttujan välisen AND-operaattorin aikaansaannos.

Esim.

muuttuja_1 = 9 & 14;

Muuttuja muuttuja_1 pitää sisällään luvun 8, joka on tuloksena bittitason &-operaatiosta luvuilla 9 ja 14.

1 0 0 1 (9) & 1 1 1 0 (14) 1 0 0 0 (8)

/* Bittitason AND */ #include <stdio.h> int main() { int muuttuja_1, muuttuja_2 = 9, muuttuja_3 = 14; muuttuja_1 = muuttuja_2 & muuttuja_3; printf(”Muuttuja 1. arvo desimaalilukuna %d”, muuttuja_1); getch(); return 0; }




BITTITASON OR ( | )

Bittitason | ( OR ) operaattori asettaa tuloksena olevan bitin ykköseksi, jos jompikumpi tai molemmar operandin biteistä on yksi. Tuloksena olevan bitin arvo on taas nolla, jos molemmat operandin biteistä ovat nollia. Operaattoria | käytetään testaamaan, onko jompikumpi biteistä asetettu ykköseksi.

Bittitason OR totuustaulu ( | )
1.bitti OR 2.bitti Tulos
1 | 1 1
1 | 0 1
0 | 1 1
0 | 0 0

Totuustaulussa jomman kumman tai molempien bittien on oltava Tosi, jotta tulos on Tosi.

Rakenne:
Bittitason | (OR) yhdistää bitti bitiltä kaksi muuttujaa.

muuttuja_1 = muuttuja_2 | muuttuja_3;

Tuloksena on muuttuja, joka on kahden muuttujan OR -operaation aikaansaannos.

Esim.

muuttuja_1 = 9 | 14;

Muuttujan muuttuja_1 arvo on 15.

1 0 0 1 (9) | 1 1 1 0 (14) 1 1 1 1 (15)

/* Bittitason OR */ #include <stdio.h> int main() { int muuttuja_1, muuttuja_2 = 9, muuttuja_3 = 14; muuttuja_1 = muuttuja_2 | muuttuja_3; printf(”Muuttuja 1. arvo desimaalilukuna %d”, muuttuja_1); getch(); return 0; }




BITTITASON XOR ( ^ )

Operaattori ^ tunnetaan nimellä bittitason XOR, tai bittitason ekslusiivinen OR -operaattori. Se asettaa tulosbitin ykkäseksi, jos jompikumpi operandin biteistä on yksi. Mikäli molemmat operandin bitit ovat ykkösiä tai molemmat operandit ovat nollia, XOR asettaa tulosbitin nollaksi.

Bittitason XOR-totuustaulu ( ^ )
1.bitti XOR 2.bitti Tulos
1 | 1 0
1 | 0 1
0 | 1 1
0 | 0 0

XOR-operaattorilla molempien puolien tulee olla Tosi tai molempien puolien on oltava Epätosi, jotta tulos on Tosi.

Rakenne:
Bittitason ^ (XOR) yhdistää bitti bitiltä kaksi muuttujaa:

muuttuja_1 = muuttuja_2 ^ muuttuja_3;

Tuloksena on muuttuja, joka on kahden muutujan XOR -operaation aikaansaannos.

Esim.

muuttuja_1 = 9 ^ 14;

Muuttujan tulos arvo on 7.

1 0 0 1 (9) ^ 1 1 1 0 (14) 0 1 1 1 (7)

/* Bittitason XOR */ #include <stdio.h> int main() { int muuttuja_1, muuttuja_2 = 9, muuttuja_3 = 14; muuttuja_1 = muuttuja_2 ^ muuttuja_3; printf(”Muuttuja 1. arvo desimaalilukuna %d”, muuttuja_1); getch(); return 0; }




BITTITASON 1:n KOMPLEMENTTI ( ~ )

Operaattori ~ on 1:n komplementtioperaattori. Komplementtioperaattori operoi vain yhdellä operandilla kääntäen operandin bitin vastakohdakseen.

Bittitason 1:n kompelementti totuustaulu ( ~ )

1:n komplementti bitti Tulos ~ 1 0 ~ 0 1

1.kompelementti Bitti Tulos
~ 1 0
~ 0 1

Käytettäessä operaattoria ~ saadaan tulokseksi eri arvot riippuen siitä käytetäänkö 16- vai 32-bittistä kääntäjää. Operaattori ei tee lukua negatiiviseksi vaan kääntää numeron bittikuvion päinvastaiseksi.

Rakenne:
Bittitason operaattori ~ kääntää jokaisen bitin vastaiseksi arvokseen.

muuttuja_1 = ~ muuttuja_2;

Esim.

~ 1 0 0 1 (9) 0 1 1 0



/* 1. kompelentti */ #include <stdio.h> int main() { unsigned char muuttuja_1 = ~9; signed char muuttuja_2 = ~9; unsigned int muuttuja_3 = ~9; signed int muuttuja_4 = ~9; unsigned long muuttuja_5 = ~9; signed long muuttuja_6 = ~9; printf(" Numeron 9 yhden komplementteja eri muuttujatyypeilla:\n\n"); printf(" unsigned char: %i", muuttuja_1); printf("\n signed char: %i", muuttuja_2); printf("\n unsigned int: %i", muuttuja_3); printf("\n signed int: %i", muuttuja_4); printf("\n unsigned long: %i", muuttuja_5); printf("\n signed long: %i", muuttuja_6); getch(); return 0; }




ESIMERKKEJÄ BITTITASON OPERAATTOREIDEN KÄYTÖSTÄ


Esimerkki.

/* Ohjelmassa käytetään operaattoria & tarkistamaan onko numero pariton vai parillinen */ #include <stdio.h> int main(void) { int input = 2; if (input & 1) printf(”Numero on pariton”); else printf(”Numero on parillinen”); }




Esim.

/* Ohjelma muuntaa syötetyt kirjaimet isoiksi, elleivät ne jo ole isoja */ #include <stdio.h> #define BITMASK (0xDF) int main(void) { char first, middle, last; first = 's'; middle = 'B'; last = 'p'; first = first & BITMASK; middle = middle & BITMASK; last = last & BITMASK; printf( "Kirjaimet ovat: %c %c %c",first, middle, last); getch(); return 0; }




Esimerkki.

/* Ohjelmassa käytetään bittikohtaista siirto-operaattoria */ #include <stdio.h> int main(void) { int num1 = 25, num2 = 102, shift1, shift2; shift1 = num2 << 3; printf( "25 siirrettyna vasemmalle kolme kertaa on %d\n", shift1 ); shift2 = num1 >> 3; printf("102 siirrettyna oikealle kolme kertaa on %d\n", shift2); getch(); return 0; }




Esimerkki.

/* Kertominen ja jakaminen bittisiirroilla */ #include <stdio.h> int main(void) { int num1=16, num3 = 16, num4 = 0x8000; num1 = num1 << 4; num3 = num3 >> 2; num4 = num4 >> 1; printf(” 16 * 16 on %d\n”, num1); printf(” 16 / 16 on %d ja 0x800 / 2 on 0x %x\n”, num3, num4); return 0; }