cw3a.pdf

(47 KB) Pobierz
cw3
Bitowe operatory logiczne
Uwaga: Nie moŜna ich uŜywać do danych typu float lub double.
& bitowa koniunkcja
| bitowa alternatywa
^ bitowa róŜnica symetryczna
« przesunięcie w lewo
» przesunięcie w prawo
~ uzupełnienie jedynkowe
Koniunkcja bitowa &
& stosuje się często do ”zasłaniania” pewnego zbioru bitów, np.
c = n&0177;
są zerowane wszystkie oprócz siedmiu najniŜszych bitów wartości zmiennej n.
Np.
a = 7&4 = (00000111) U2 &(00000100) U2 = (00000100) U2 = 4
b = 100&57 = (01100100) U2 &(00111001) U2 = (00100000) U2 = 32
c = (-25)&55 = (11100111) U2 &(00110111) U2 = (00100111) U2 = 39
Ŝ nice mi ę dzy & i &&
Np. Jeśli x=1, y=2 to
x & y ma wartość 0
x && y 1
Bitowy operator alternatywy |
UŜywany do ”ustawiania” bitów. Np.
x = x|MASK;
ustawia 1 na tych bitach w zmiennej x, które w MASK są równe 1.
Np.
a = 7|4 = (00000111) U2 |(00000100) U2 = (00000111) U2 = 7
b = 100|57 = (01100100) U2 |(00111001) U2 = (01111101) U2 =125
c = (-25)|55 = (11100111) U2 |(00110111) U2 = (11110111) U2 = -9
Bitowa ró Ŝ nica symetryczna ^
Ustawia jedynkę na kaŜdej pozycji bitowej tam, gdzie bity w obu argumentach są róŜne,
a zero tam, gdzie są takie same. Np.
x = 011^022;
daje w rezultacie wartość 0.
Np.
a = 90^(-24) =(01011010) U2 ^(11101000) U2 = (10110010) U2 = -78
b = 127^85 =(01111111) U2 ^(01010101) U2 = (00101010) U2 = 42
c =(-5)^(-44) =(11111011) U2 ^(11010100) U2 = (00101111) U2 = 47
Operatory przesuni ę cia « oraz »
SłuŜą do przesuwania argumentu stojącego po lewej stronie operatora o liczbę pozycji
określoną przez argument stojący po prawej stronie. Np.
y = x << 2;
przesuwa x w lewo o dwie pozycje, zwolnione bity wypełnia się zerami (operacja
równowaŜna mnoŜeniu przez 4.
y = x >> 2;
dla wielkości typu unsigned zwolnione bity zawsze są wypełniane zerami. Natomiast dla
wielkości ze znakiem spowoduje to na pewnych maszynach wypełnienie tych miejsc bitem
znaku (przesunięcie arytmetyczne), a na innych zerami (przesunięcie logiczne).
Np.:
a1 = 80>>2 = (01010000) U2 >>2 = (00010100) U2 = 20
b1 =127>>5 = (01111111) U2 >>5 = (00000011) U2 = 3
c1 = -15>>2 = (11110001) U2 >>2 = (11111100) U2 = -4
a2 = 5<<4 = (00000101) U2 <<4 = (01010000) U2 = 80
b2 =(-7)<<3 = (11111001) U2 <<3 = (11001000) U2 = -56
c2 = (-1)<<7 = (11111111) U2 <<7 = (10000000) U2 = -128
ZauwaŜmy, Ŝe przesunięcia bitowe liczb dodatnich o N mnoŜą (<<) albo dzielą
(>>) te liczby przez N-tą potęgę liczby 2, o ile wynik mnoŜenia nie przekroczy
zakresu wartości typu przesuwanej liczby. Przesunięcia wykonywane są duŜo szybciej
niŜ mnoŜenia lub dzielenia.
15 << 3 daje w wyniku tyle co 15×8 bo 8 = 2 3 ,
15 >> 3 daje w wyniku tyle co 15/8.
Rotacja liczby ujemnej w prawo mo Ŝ e by ć przyczyn ą złego działania programu.
Dopełnienie jedynkowe (negacja bitowa) ~
Zamienia kaŜdy bit 1 na 0 i odwrotnie. Typowe uŜycie:
y = x&~077;
zasłania się zerami ostatnie sześć bitów zmiennej x.
Uwaga: Ta konstrukcja nie zaleŜy od maszyny, pod-czas gdy:
y = x&0177700;
zakłada 16-bitowe słowo maszynowe. Np.
~ (47) 10 = ~ (00101111) U2 = (11010000) U2 = (-48) 10
JeŜeli zaleŜy nam na szybkim obliczeni wartości negacji danej liczby pomoŜemy zauwaŜyć,
Ŝe w wyniku negacji otrzymaliśmy po prostu :
~a = - (a+1)
ZauwaŜmy, Ŝe
k & 1 << n – testuje n -ty bit z k ,
k ^ 1 << n – daje w wyniku k z zanegowanym n -tym bitem,
k & ~(1 << n) – daje w wyniku k z wyzerowanym n -tym bitem,
k | 1 << n – daje w wyniku k z ustawionym n -tym bitem.
Przykład :
/* getbits: daj n bitow x od pozycji p
Zerowa pozycja bitu jest prawy koniec x;
n, p są sensownymi wielkościami całkowitymi
*/
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
Operacje bitowe na znakach
char toupper(char c)
// Funkcja zamienia male litery na duze
{
char maska=223; /* 223 - 11011111 */
return c & maska;
}
char tolower(char c)
// Funkcja zamienia duze litery na male
{
return c | 32; /* 32 - 00100000 */
}
char swapcase{char c)
//Zamiana duzych liter na male i odwrotnie
{
return c ^ 32;
}
int razy10(int n)
/* Mnozenie liczby calkowitej przez 10
przy pomocy operatorow przesuniecia */
{
int m,p;
m=n<<1;
p=m<<2;
return m+p;
}
/* Zlicz bity argumentu o wartosci 1 */
int bitcount(unsigned x)
{
int b;
for (b=0; x!=0; x >> 1)
if (x & 01)
b++;
return b;
}
957832.001.png 957832.002.png
Zgłoś jeśli naruszono regulamin