© 2012
Grzegorz Łukawski & Maciej Lasota
Politechnika Świętokrzyska w Kielcach
Operacje bitowe
Priorytety operatorów
Wskaźniki do funkcji
Programowanie
w języku C
comm
Operatory bitowe w języku C
Operatory bitowe w języku C działają tylko na liczbach całkowitych!
|
Suma bitowa (OR)
&
Iloczyn bitowy (AND)
^
Suma modulo 2 (XOR)
~
Dopełnienie jedynkowe (NOT)
Przesuwanie bitów
Przesuwanie w lewo:
00110110
(54)
<<
01101100
(108)
<<
11011000
(216)
Przesuwanie w prawo:
00110110
(54)
>>
00011011
(27)
>>
00001101
(13)
UWAGA!
Przesuwanie bitów w lewo odpowiada mnożeniu przez 2, przesuwanie
w prawo odpowiada dzieleniu całkowitemu przez 2.
Przesuwanie bitów w języku C
int
zm = 54;
// Przesunięcie w lewo o 2 pozycje:
int
zm2 = zm << 2;
// Przesunięcie w prawo:
int
zm3 = 16 >> 2 | zm;
Operator(y)
Łączność
1
() [] -> .
lewo
2
! ~ ++ -- + - * & (typ) sizeof
prawo
3
* / %
lewo
4
+ -
lewo
5
<< >>
lewo
6
< <= > >=
lewo
7
== !=
lewo
8
&
lewo
9
^
lewo
10 |
lewo
11 &&
lewo
12 ||
lewo
13 ?:
prawo
14 = += -= *= /= %= ^= |= &= <<= >>=
prawo
15 ,
lewo
Priorytety operatorów
wy
=
*
ws
*
tb
[
i
+
2
]
+
(
a
<
0
?
0
:
a
*
a
)
;
wy
ws
tb
i
2
a
0
0
a
a
+
*
*
[]
<
?:
*
+
=
Wskaźniki do funkcji
Funkcje w języku C nie są zmiennymi, ale mimo wszystko istnieje
możliwość definiowania do nich wskaźników. Wskaźniki takie można
przekazywać jako argument innej funkcji, umieszczać w tablicach
i strukturach, itp.
Deklaracja wskaźnika do funkcji zawiera typ zwracany i listę argumentów
z ich typami.
UWAGA!
Deklaracja wskaźnika do funkcji musi zawierać nawiasy okrągłe,
w przeciwnym razie zostanie zinterpretowana jako prototyp funkcji.
Wskaźniki do funkcji – przykład
// Deklaracja wskaźnika do funkcji:
int
(*wsk_fun)(
char
*,
int
);
// Wywołanie:
int
x = (*wsk_fun)(tekst, 10);
if
((*wsk_fun)(
"Abcd"
, 4) == 5)
//...
Przykład – szukanie maksimum
int
szuk_max(
char
*tab[],
int
n,
int
(*cmp)(
const
char
*,
const
char
*))
{
int
max=0, i;
// Wywołanie przez wskaźnik funkcji porównującej:
for
(i=1;i < n;i++)
if
((*cmp)(tab[i], tab[max]) > 0)
max = i;
return
(max);
}
int
main() {
char
*teksty[] = {
"Basia"
,
"Ania"
,
"Zuzia"
,
"Kasia"
,
"Ola"
};
int
maks = szuk_max(teksty, 5, strcmp);
// strcmp
puts(teksty[maks]);
// Zuzia
return
(0);
}
int
numer_cmp(
const
char
*t1,
const
char
*t2) {
long
v1 = atol(t1);
long
v2 = atol(t2);
if
(v1 > v2)
return
(1);
if
(v1 < v2)
return
(-1);
return
(0);
}
int
main() {
char
*liczby[] = {
"100"
,
"0"
,
"88"
,
"13333"
,
"-5"
};
maks = szuk_max(liczby, 5, numer_cmp);
puts(liczby[maks]);
// 13333
return
(0);
}
Przykład – funkcja porównująca