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
Ró
Ŝ
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;
}
Plik z chomika:
mendieta
Inne pliki z tego folderu:
cw4gr3(1).rar
(7 KB)
cw4gr3.rar
(7 KB)
cw4.txt
(1 KB)
cw3_gr3.pdf
(51 KB)
s202615.rar
(7 KB)
Inne foldery tego chomika:
Sully Erna ''Avalon''
w kręgu wicca
zachomikowane
Zgłoś jeśli
naruszono regulamin