Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Bit kaydırma hakkında

Başlatan baran123, 02 Ağustos 2014, 01:10:29

baran123

İyi akşamlar 2 adet sorum olacak

1)
x >>= 1; 
         
if(x == 0x??)
{
    x = 0x80; // 8 bitlik sayı en sola gelecek sonra tekrar butona basıcam tekrar sola kayacak ama ben if in içine gitmesini istiyorum  if e 0x kaç yazmam lazım ? 0x01 1 bit sağa kaydırırsak ne olur ?
                    // yani 2 inci örnektekinin tersi 2 ci örnek çalışıyor
}

x <<= 1; 
         
 if(x == 0x100)
{
    x = 0x01; // bunun tersi olacak ilk örnek
}


2) valla sorcağım soruyu unuttum oda kaydımayla ilgiliydi neyse yazarım aklıma gelirse  ;D

Gökhan BEKEN

A<<B komutu ile aslında: A sayısını, B kere sola kaydırıyor
A>>B komutu ile aslında: A sayısını, B kere sağa kaydırıyor

Örneğin:
24 >> 2  demek: (0b00011000 >> 2)  demektir
(0b00011000 >> 2)  işleminin sonucu 0b00000110 eder

14 << 3  demek: (0b00001110 << 3)  demektir
(0b00001110 << 3)  işleminin sonucu 0b01110000 eder

sorunu tam anlatmadığın için genel bir cevap vermek durumundayım.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

8 bitlik bir sayıyı kaydırıyorum mesela sola sayı 0000 0001 olsun ben bunu sağa kaydırırsam  ne olur ? ben soyle olmasını ıstıyorum ıf le 1000 0000

2 ci sorum ise söyle simdi bitkaydırırken basına veya solun 0 eklıyor ya 0001 << 1 yapsak 0010 olur ben 1 eklemesını ıstıyorum yanı 0001 << 0011 gibi

Gökhan BEKEN

Sola kaydırdığında sayıyı eski haline getiremezsin. Bunun için başka bir değişkene orjinal değeri saklaman gerekir.
0000 0001 gibi bir sayı için farketmez ama örneğin 0b01011011 sayısını sola kaydıralım
0b01011011<<1 işleminin sonucu = 0b10110110
0b10110110<<1 işleminin sonucu = 0b01101100
0b01101100<<1 işleminin sonucu = 0b11011000
0b11011000<<1 işleminin sonucu = 0b10110000
0b10110000<<1 işleminin sonucu = 0b01100000
0b01100000<<1 işleminin sonucu = 0b11000000
0b11000000<<1 işleminin sonucu = 0b10000000

şimdi tekrar sağa kaydırarak eski haline getiremeyiz.


Alıntı yapılan: baranekrem9 - 02 Ağustos 2014, 01:28:23
2 ci sorum ise söyle simdi bitkaydırırken basına veya solun 0 eklıyor ya 0001 << 1 yapsak 0010 olur ben 1 eklemesını ıstıyorum yanı 0001 << 0011 gibi
Sağa kaydırmanın sonucunda doğal olarak en soldaki bite(MSB) 0 gelecektir,
sola kaydırınca da en sağa 0 gelir.
Maskeleme yaparak bu sorunu halledebilirsin.
0b10011011 sayısını 1 kez sola kaydıralım:
sayi=0b10011011;
sayi=sayi<<1;
sayı bu oldu: 0b00110110, sağa eklenen sayının 0 değil de 1 olmasını istiyorsan
sayi++; demen yeterli. veya daha mantıklı yoldan maskeleme yaparak:
sayi|=0b00000001; //veya işlemi ile halledebilirsin

benzer işlemi sağa kaydırırken de yapabilirsin:
0b10011011 sayısını 1 kez sağa kaydıralım:
sayi=0b10011011;
sayi=sayi>>1;
sayı bu oldu: 0b01001101, sola eklenen sayının 0 değil de 1 olmasını istiyorsan
sayi+=128; demen yeterli. veya daha mantıklı yoldan maskeleme yaparak:
sayi|=0b10000000; //veya işlemi ile halledebilirsin
hatta 0b10000000 sayısını otomatik oluşturarak: sayi|=1<<7; yapabilirsin.
Özel mesaj okumuyorum, lütfen göndermeyin.

sadogan

C de caryy ile kaydırma yok diye biliyorum .
1 bit sağa kaydırmak 2 bölmek olduğundan
01'i sağa 1 kez kaydırırsanız sonuç 0 olur.

baran123

#5
Ox10 《《1 yaptigim zaman 0x100 oluyor ccs c de

mesaj birleştirme:: 02 Ağustos 2014, 02:25:00

@meftun çok teşekkür ederim

Gökhan BEKEN

Alıntı yapılan: baranekrem9 - 02 Ağustos 2014, 02:17:47
Ox10 《《1 yaptigim zaman 0x100 oluyor ccs c de


değişken 16 bitlik ise dediğin gibi olabilir ama 8 bitliklerde olmaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

hasankara

sayi++ ı kontrolsüz kullanmak işini görmez ama. atıyorum sağa kayacak ise, en sağdaki bit değerinin, işlem sonunda en solda ki bit hücresine gelmesini istiyor isek, en sağdaki bit i bir yerde kayıt etmemiz gerekir, kaydırma işleminden sonra o saklı olan biti ulaşmasını istediğimiz yere yerleştirmeliyiz. Yada derleyici pdf lerine konu olan bitset bitclr konularına baktığımız zaman hemen alttakine benzer örnekler verildiği görülüyor. Böyle durumlarda derleyici pdf lerine bakmakta fayda var baranekrem.

sayi=0b10011011;
sayi = (sayi << 1) | (sayi >> 7); // sayiyi 1 kez sola döndürdü 
sayi = (sayi << 2) | (sayi >> 6); // sayiyi 2 kez sola döndürdü


dikkat ettiysen iki örnekte de döndürme sayılarının toplamı 8, buradan yola çıkarak;

#define donSol(a,x) ((a<< x) | (a>> (8-x)))
#define donSag(a,x) ((a>> x) | (a<<(8-x)))// tamımlamalarını yaparak;

sayi=donSol(sayi,1);
sayi=donSag(sayi,3);// şeklinde döndürme işlemlerini istediğin kadar yapabilirsin.


8 bitlik değişkenler için #define tanımlamasında 8-x yazdık. atıyorum 32 bitlik bir değişkeni döndürme yapmak istiyor ise 32-x yazar isen bu değişkenleride anlaşılır şekilde döndürebilirsin. eğer 32 bitlik değişkeni benim verdiğim örnekteki tanımlamalarda döndürme işlemi yaptırırsan çok anlamsız sonuç elde edebilirsin. veya tek tanımlamayla ben döndürme tanımlamalarımı halletmek istiyorum diyor isen;

#define donSol(a,x,k) ((a<< x) | (a>> (k-x)))
şeklinde 8 yerine k diyerek bir parametre daha ekledik ve bu sefer değişkenin bit uzunluğunu da belirtmiş olduk.

RaMu

Kaydırma işlemleri için aslında asm de nasıl yapıldığını bilmek bakmak çok faydalı olur,
ccsc için soruluyor soru sanırım,
ccsc de >> veya << ile
rotate_left degisken
şeklinde iki farklı kaydırma var,
bunların ikiside farklı şekilde kaydırma yapar,
şimdi asmye döneyim,
asmde kaydırma işlemi Carry yani elde biti ile beraber yapılır,
yani sayıyı sağa yada sola kaydırdığınızda kayan bit carry ye düşer ve carry de bulunan bitte sayıya kayar,
işte bu şekilde kaydırma yapan ccsc deki komut rotate left right komutu.
(carry biti status registerının bir biti birçok mantıksal işlemde rol oynar,
herhangibir md.nin datasheetinden bakıp inceleyebilirsiniz.

Kısaca değişkeniinin adı deger olsun, yapacağın şu;
rotate_left(&deger,1);
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Dediklerinizi deneyeceğim tesekkürler :)