08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

{<br />

int number;<br />

printf("bir sayı girin : ");<br />

scanf("%d", &number);<br />

printf("sayınızın %d biti 1n", no_of_setbits(number));<br />

}<br />

return 0;<br />

Şimdi de çok daha hızlı çalışacak bir işlev tasarlayalım:<br />

int no_of_setbits(unsigned int value)<br />

{<br />

static int bitcounts[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3,<br />

4};<br />

int counter = 0;<br />

for (; value != 0; value >>= 4)<br />

counter += bitcounts[value & 0x0F];<br />

}<br />

return counter;<br />

Yukarıda tanınımlanan işlevde yer alan for döngüsü içinde, döngünün her turunda value<br />

değişkeninin düşük anlamlı 4 bitindeki birlenmiş bitlerin sayısı, 4 bitin sayısal değerinin<br />

bitcounts isimli diziye indis yapılmasıyla elde ediliyor. Örneğin 4 bitlik alanda ifade edilen<br />

tamsayının değeri 11 olsun:<br />

11 = 1011<br />

Bu sayının toplam 3 biti 1'dir.<br />

bitcounts dizisinin 11 indisli elemanın değeri 3'tür. Döngünün bir sonraki turuna<br />

geçmeden önce value değişkeni sağa 4 kez kaydırılarak bu kez value'nun bir sonraki 4<br />

bitlik alanındaki bitlere bakılıyor.<br />

Aşağıda işlem hızını daha da artıran bir işlev tanımlanıyor:<br />

const static char bit_array[] = {<br />

0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,<br />

1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,<br />

1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,<br />

1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,<br />

2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,<br />

3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,<br />

3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,<br />

4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8<br />

};<br />

int count1bits(unsigned long x)<br />

{<br />

438

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!