90 likes | 189 Views
Bevezetés a programozásba. Krankovits Melinda. Programozás C nyelven. Műveletek és kifejezések. Bit szintű operátorok ( ~, <<, >>, &, ^ és |). A bit szintű operátorok csak signed és unsigned egész típusú adatokra: char , short , int és long használhatók.
E N D
Bevezetés a programozásba Krankovits Melinda 2009
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) A bit szintű operátorok csak signed és unsigned egész típusú adatokra: char, short, int és long használhatók. Legmagasabb prioritási szinten az egyoperandusos, jobbról balra kötő egyes komplemens operátor (~) van, melynek definíciója: ~ előtag-kifejezés Az operátor előbb végrehajtja az egész–előléptetést, ha szükséges. Az eredmény típusa az operandus konverzió utáni típusa. Az eredmény maga a bit szintű egyes komplemens, azaz ahol az operandus bit 1 volt, ott az eredmény bit 0 lesz, és ahol az operandus bit 0 volt, ott az eredmény bit 1 lesz. Feltéve, hogy az egész–előléptetés 16 bites, és hogy: unsigned short x = 0XF872, /* 1111100001110010 */ maszk = 0XF0F0;/* 1111000011110000 */ , akkor a ~x 00000111100011012, és a ~maszk 00001111000011112.
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) Miután a C–ben nincs egész alul vagy túlcsordulás, a << és >>műveletek értékvesztést is okozhatnak, ha az eltolt eredmény nem fér el az első operandus konvertált típusában. A balról jobbra csoportosító eltolás operátorok (<< és >>) prioritása alacsonyabb az aritmetikai műveletekénél, de magasabb, mint a reláció operátoroké. Az eltolás operátorok első operandusuk értékét balra (<<) vagy jobbra (>>) tolják annyi bitpozícióval, mint amennyit a második operandus meghatároz. A K1<<K2 balra tolja K1 értékét K2 bitpozícióval úgy, hogy jobbról 0 bitek jönnek be. A K1>>K2 művelet K1 értékét K2 bitpozícióval tolja jobbra. Ha K1 valamilyen unsigned típusú, akkor balról 0 bitek jönnek be. Ha K1 signed, akkor az operátor az előjel bitet sokszorozza. unsigned, nem negatív K1 esetén a jobbra tolás K1/2K2 hányados egész részeként is interpretálható.
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) Eltolás példa: unsigned short x = 0XF872, /* 1111100001110010 */ maszk = 0XF0F0;/* 1111000011110000 */ , akkor a ~x 00000111100011012, és a ~maszk 00001111000011112. , akkor x<<2 11100001110010002, ill. a maszk>>5 00000111100001112
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) A bit szintű logikai operátorok prioritásuk csökkenő sorrendjében az és (&), a kizáró vagy (^), valamint a vagy (|). A többi műveletre való tekintettel prioritásuk magasabb a kétoperandusos logikai operátorokénál, de alacsonyabb a relációkénál. A művelet bitről-bitre valósul meg az operandusok értékén, s egy bitre vonatkoztatva az eredmény így néz ki:
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) Példa bitszintű logikai operátorokra: unsigned short x = 0XF872, /* 1111100001110010 */ maszk = 0XF0F0;/* 1111000011110000 */ , akkor a ~x 00000111100011012, és a ~maszk 00001111000011112. , akkor x<<2 11100001110010002, ill. a maszk>>5 00000111100001112 , az x|maszk értéke 11111000111100102. Állíthatjuk, hogy az eredményben minden olyan bit egy, ami a maszk–ban az volt. Az x^x eredménye biztosan tiszta zérus. , az x&~maszk értéke 00001000000000102.
Programozás C nyelven Műveletek és kifejezések Bit szintű operátorok ( ~, <<, >>, &, ^ és |) Összetett példa: binaris.c … num=0; while ( (c=getchar()) !=EOF ) { if ( c!='\n' && c>='0' && c<='9' ) { /* ASCII - bin ris konverzi˘ */ num = num*10 + c - '0'; } else { /* a sz m v‚ge */ printf("%u sz m bin risan : ", num); for (i=16; i>0; i--) { bit = num >> 15 ; /* a vezet‹ bit a v‚g‚re kerl */ bit = bit + '0' ; /* a 0 vagy 1 ir sjel el‹ llˇt sa */ putchar(bit); num = num << 1; /* a k”vetkez‹ bit a vezet‹ helyre kerl */ } putchar('\n'); printf("\nG‚pelj be egy pozitˇv sz mot (1 .. 65535) : "); num = 0; fflush(stdin); } }
Programozás C nyelven Műveletek és kifejezések Hozzárendelés operátorok = *= /= %= += -= &= ^= |= <<= >>= Van tehát egyszerű hozzárendelés operátor (=) és vannak összetettek vagy kombináltak (ezek a többiek). A K1 = K2 kifejezésben K1-nek módosítható balértéknek kell lennie. (megjegyzés: jobbérték fogalma!) A definíció megengedi a hozzárendelés operátor K1 = K2 = K3 = ... = Kn = kifejezés formájú használatát is, amikor is a kifejezés kiértékelése után jobbról balra haladva az operandusok felveszik a kifejezés értékét. Az egész konstrukció értéke most is a kifejezés értéke lesz.
Programozás C nyelven Műveletek és kifejezések Hozzárendelés operátorok = *= /= %= += -= &= ^= |= <<= >>= Kombinált operátorok: … for(ft=ALSO; ft<=FELSO; ft=ft+LEPES) /*Most így írható*/ for(ft=ALSO; ft<=FELSO; ft+=LEPES) Megjegyzés: A += és –= bal oldali operandusa mutató is lehet, amikor is a jobb oldali operandus köteles egész típusú lenni.