C programlama Örneği(Bit Ve-Öteleme)

Coşkun Gökay

Öğrenci
Katılım
7 Şubat 2019
Mesajlar
4
Reaksiyon puanı
1
Puanları
1
Yaş
33
Arkadaşlar merhabalar aşağıdaki programın mantığını açıklayabilecek olan var mı?Şimdiden teşekkürler.
65581
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
selam hocam,

baktim siteye girmemissin sorudan sonra ama yine de cevaplayayim belki baska birine lazim olur.

Simdi a isimli bir tamsayi olusturulmus ve hexadecimal olarak degeri verilmis. Yani 157c sayisi onaltilik tabanda. bunun onluk karsiligi 5500 e denk geliyor. Ama bit kaydirma islemini biz ikilik tabanda yaptigimiz icin bunu ikilik tabana cevirmek lazim o da su sekilde.

1010101111100

daha anlasilir olmasi icin 4 er bit seklinde ayiralim 0001 0101 0111 1100 . (sagdan basladim ayirmaya, soldaki tek kaldi o yüzden basina sifir ekledim). Bu bizim a degerimiz.

simdi istenene bakalim.

b = a >> 5 & 3;
diyor ki, a degerinin bitlerini 5 kere saga kaydir ve daha sonra "bit ve" islemi uygula.
5 kere saga kaydir demek, bitleri tek tek saga dogru kaydiracaksin. (toplamda 16 bit var ve bu bitler tek tek saga gidecek,)

  1. kaydirma=> 0000 1010 1011 1110 (basa bir sifir ekledim ve diger bitler saga kaydi, en sonda olan tek sifir gitti)
  2. kaydirma=> 0000 0101 0101 1111
  3. kaydirma=> 0000 0010 1010 1111
  4. kaydirma=> 0000 0001 0101 0111
  5. kaydirma=> 0000 0000 1010 1011

5. kere kaydirinca elimizdeki sayi artik bu old 0000 0000 1010 1011
yani suan biz sadece a >> 5 islemini yaptik. Daha sonra bizden & (ve demek). 3 ile ve islemine tabi tutmamiz isteniyor. Oncelikle 3 sayimizi yazalim ikilik sistemde. 11 (3 demek 2lik tabanda).
Ve islemi yapabilmemiz icin bit sayilarinin esit olmasi lazim. O yüzden "11" sayisina sifirlar ekleyip a>>5 islemindeki bit sayisina esitliyorum o zaman da

0000 0000 0000 0011 (gördügün gibi 11 aynen duruyor, sadece solunda sifirlar var)

simdi tekrar a>>5 den gelen sonucu yaziyorum ve altina 3 sayisinin 2 lik degerini yaziyorum

0000 0000 1010 1011 . (buna üstteki sayi diyorum)
0000 0000 0000 0011 (buna alttaki sayi diyorum)

ve islemi demek tek tek bitleri birbiriyle carpmaktir. Bu carpma islemi yukaridaki ve asagidaki bitler icin tek tek olur. 0 ile bir seyin carpimi her zaman sifirdir, 1 ile 1 in carpimi 1 dir. O halde bunlari tek tek bit bazinda carparsak

0000 0000 0000 0011 bu sayiyi yani yine 3 ü elde ederiz. Carpmayi biraz aciklayayim

Soldaki bitimiz üssteki (a>>5 degeri yani) sayida 0, alttaki sayida 0 o halde 0 ile sifirin carpimi 0 dir.
Ikinci bit de ikisinde de sifir, ta ki soldan 9. bit, üsttekinde 1 ama alttakinda sifir. Yine de 1 ile 0 in carpimi sifir . O yüzden en sagdan son iki bit harici tüm bit carpimi sifir olur yani

0000 0000 0000 00

sonraki asama, üstteki sayinin en sagdan 2. biti 1, alttaki sayinin da 1. bunlarin carpimi 1 olur o halde

0000 0000 0000 001 oldu
devam ediyorum. üstteki sayinin en sag biti 1, alttaki sayinin en sag biti de 1, bunlarin da carpimi 1 oldu.

0000 0000 0000 0011

bu da bizim sonucumuz oldu.
yani b=3 ya da b= 0000 0000 0000 001 (2lik sayi sisteminde)

umarim aciklayici olmustur.
 

Coşkun Gökay

Öğrenci
Katılım
7 Şubat 2019
Mesajlar
4
Reaksiyon puanı
1
Puanları
1
Yaş
33
Hocam öncelikle cevabın için çok teşekkürler.
Şimdi anlamadığım 2 kısım var 1.olarak 5.ve6. bitleri bulmak için neden 5kez sağa öteleme yaptık mantığı ne?
2.olarak uygun dediği sayı neden 3?
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
Hocam öncelikle cevabın için çok teşekkürler.
Şimdi anlamadığım 2 kısım var 1.olarak 5.ve6. bitleri bulmak için neden 5kez sağa öteleme yaptık mantığı ne?
2.olarak uygun dediği sayı neden 3?

selam hocam tekrar :)

Cok zor bir is degil o da.. ama ondan önce bit islemlerine biraz daha degineyim.. Islemciler bildigin gibi temelde ikilik sistem üzerine kurulu ve onlar üzerinde calisir ve tüm islemler sadece 1 ve 0 lar üzerinden yürür. Ayrica ikilik sistemde matematiksel islemler de cok kolay..

Bir örnek vereyim. Mesela 128 x 16 kac yapar? Bilgisayar bunu cok kolay sekilde yapar ve bunu da bit kaydirarak yapar. Söyle
128 in bit eslenegi 10000000
16 nin bit eslenegi ise 10000 dir
16 yi saglayan 1 in sira numarasi 4 tür (sagdan ve sifirdan indexle saymaya baslarsan 4 cikar). (burdaki tablodan da bakabilirsin)
O halde ben 128 sayisinin bitlerini 4 basamak sola kaydirirsam 16 ile carpmis olurum yani:

100000000000 (koyu renkli olanlari sola 4 kere kaydirdigim icin ekledim)
o halde benim sayimin 10 luk tabanda karsiligi ne oldu? 2048 (100000000000) olmus olur..
Bu islem, bilgisayarda 128x16 yi 10 luk tabanda carpmaktan cok daha kolay.. O yüzden tüm islemler bu sekilde yürüyor..

Simdi soruna gelelim.. Hocanin sordugu sey pek acik degil. Demek istedigi su, 5 ve 6. bitlerin degeri nedir yani 0 mi yoksa 1 mi bunlar.. Yani bizden 5 ve 6 bitleri bulmamizi istiyor.
sayiyi tekrar yaziyorum ve istenilen bitleri koyu renkle isaretliyorum

0001 0101 0111 1100 (sagdan sola dogru ve saymayi 1 den degil de 0 dan baslarsan 5 ve 6. bit in koyuyla isaret koydugum yerler oldugunu görürsün )

Simdi benim amacim tüm sayiyi yok etmek ama o 5 ve 6 bitleri tutmak ve onlarin degerlerini göstermek.

5. biti bulabilmek icin ben tüm bitleri saga kaydirmam lazim böylece 0 dan 4 e kadar olan tüm bitleri koy etmis oluruz. O halde sayimiz söyle olacak
0000 0000 1010 1011

gördügün gibi 5 ve 6. bitler en sona yerlesti. Simdi ben kalan tüm bitleri bir sekilde yok etmem lazim, yok etmek deyince akla da carpma islemi gelir yani "ve" islemine tabi tutarsam bitleri yok edebilirim. Peki neyle ve islemine tabi tutacagim? tabi ki 5 ve 6. bitlerin degeri ile o da ne 11 (2 lik tabanda), 10luk tabanda ise degeri 3. Yani ben bu sayiyi 11 ile "ve" islemine tabi tutarsam, 11 haric tüm bitler silinecek..

Bunu yapmak icin de önce bit sayilarini esitlemem lazim. 3 sayisinin sadece iki biti var yani 11. Ama diger sayinin 16 biti var. O halde ben 11 in öne sifirlar ekleyip 16 bit haline getiriyorum ( soldaki sifirlarin bir önemi yok, sadece kalabalik yapsin diye eklendi (toplam bit sayilari esitleyelim diye))

0000 0000 0000 0011

Simdi bu ikisini ve islemine tabi tutarsam Yani 1. sayisinin 0. biti ile 2. sayinin 0 inci bitini carpiyorum, sonra birinci sayinin 1. bitiyle, 2. sayinin 1. bitini, sonra yine birinci sayinin 2. bitiyle, ikinci sayinin 2. bitini... bu sekilde carpiyorum. Dikkat edersen 2. sayim olan 3 (yani 11) in tüm bit degerleri 0 sadece en sagdan 2 tanesi 1. O halde bunlari dikey carpinca sagdaki 2 bit haric hepsinin carpimlarinin sonucu sifir cikacak ama en sagdaki bitler kalacak.
o halde, sayim ile 3 sayisinin bit ve islemi sonucu yine 3 cikiyor..

0000 0000 0000 0011

bu da demek oluyor ki, 5 ve 6. bitlerimiz 11 mis.

simdi anlayabildin mi hocam?
 

Coşkun Gökay

Öğrenci
Katılım
7 Şubat 2019
Mesajlar
4
Reaksiyon puanı
1
Puanları
1
Yaş
33
Hocam daha basit ve anlaşılır şekilde anlatılamazdı eminim ilginiz ve yardımlarınız için çok teşekkür ederim emeğine sağlık.
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
Hocam daha basit ve anlaşılır şekilde anlatılamazdı eminim ilginiz ve yardımlarınız için çok teşekkür ederim emeğine sağlık.

anlayabildigine sevindim hocam. Anlatabilecegimden pek emin degildim gerci, cünkü karisik yazdigimi düsünmüstüm. Olay aslinda cok basit ancak anlatinca baya bir uzun olabiliyor :) Yapilan is max 30 saniye ama yazmasi, okumasi, anlamasi kac dakika :)
 

Amenofis

Öğrenci
Katılım
27 Aralık 2010
Mesajlar
36
Reaksiyon puanı
9
Puanları
8
Bitlerin sayı değerini bulmak için illaki ötelemeye gerek yok. Bir sayının 5. ve 6. bit değerlerini öğrenmek istiyorsan o bit pozisyonları 1, diğerleri 0 olan sayıyla VE işlemine sokmak yeterli.

int sayi;
...
int x = sayi & 0x60; // 110 0000

Ancak bu durumda elde edilen sayı büyük olur. Bunu sadeleştirmek amacıyla küçültebiliriz. Küçültme işlemi sağa öteleme ile yapılır. Sayıyı her sağa ötelemek 2'ye bölmek demektir. Her sola ötelemek te 2 ile çarpmak. Yani bu sayıyı bit pozisyonları en sağa gelecek şekilde ötelersek en küçük sayı değeri ile bitleri almış oluruz. En düşük bit pozisyonu 5 olduğuna göre sayıyı 5 kez öteleriz. Böylece sayı 2^5'e (32'ye) bölünmüş olur.

Eğer 6 kere ötelersek elde sadece 6. bitin değeri kalır. 7 kere ötelersek sayı 0 olur, yani hiçbir şey kalmaz. Tabi bunlar öteleme işlemi VE işleminden sonra yapıldığında geçerli.
 
Üst