BITTIOPERAATIOT
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ä:
Tuloksena on muuttuja, joka on kahden muuttujan välisen AND-operaattorin aikaansaannos.muuttuja_1 = muuttuja_2 & muuttuja_3;
Esim.
Muuttuja muuttuja_1 pitää sisällään luvun 8, joka on tuloksena bittitason &-operaatiosta luvuilla 9 ja 14.muuttuja_1 = 9 & 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
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.
Tuloksena on muuttuja, joka on kahden muuttujan OR -operaation aikaansaannos.muuttuja_1 = muuttuja_2 | muuttuja_3;
Esim.
Muuttujan muuttuja_1 arvo on 15.muuttuja_1 = 9 | 14;
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
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:
Tuloksena on muuttuja, joka on kahden muutujan XOR -operaation aikaansaannos.muuttuja_1 = muuttuja_2 ^ muuttuja_3;
Esim.
Muuttujan tulos arvo on 7.muuttuja_1 = 9 ^ 14;
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
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.
Esim.muuttuja_1 = ~ muuttuja_2;
~ 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; }