Acil yardımınıza ihtiyacım var (Bilgi kaydırma hakkında)

Başlatan ziyaretci, 05 Mayıs 2012, 16:43:17

ziyaretci

 Kolay gelsin.

int metin_s_1[]={0b00000001,0b00000001,0b11111111,0b01100000,0b00011000,0b00111000};


yukarıdaki diziyi 1 bit sola kaydırmak istiyorum. yani;

int metin_s_1[]={0b00000010,0b00000011,0b11111110,0b11000000,0b00110000,0b01110000};

  rotate_left(x,1); kullandım. Serdar Çiçek'in CCS kitabında okudum.Sonradan dikkat ettim bu komut ilk bilgiyi 1 bit sola kaydırdıktan sonra açığa çıkan biti 2. bilginin boşalan bit kısmına koyuyor. Benim istediğim en son bilginin boşalan bitine koyması.

Bunu nasıl yaparım.? Acil arkadaşlar.

yldzelektronik

mantıksal operatölerle (sanırım böyle yazılıyodu :) ) yapılabilir.Ama tahminimce dizinin her elemanına tek tek müdahele etmen gerekicek.Emin değilim.Daha iyi bilen birisi söylerse bende emin olabilirim...
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein

CCS bilmiyorum.
Ama "rotate_left()" gibi bir  fonksiyon varsa, "shift_left()"   gibi bir komut olması muhtemel.

ziyaretci

 var evet fakat
 
shift_left de şöyle bir sıkıntım var o sondaki biti 1 veya 0 ile besliyor.Ayriyetten bilgiyi ilk haline getirmek için reset atmam gerekiyor pic e


Klein

Shift öyle çalışır.
yapacağın şey ilk dizi elemanından başlayarak  her elemanı shift etmek (sonuna 0 ekleyerek).
sonraki elemanı kaydırmadan önce de  carry biti ile kaydırdığın elemanı toplamak.

ekleme : öyle olmaz. ilk biti unuttuk. birazdan bir çözüm buluruz.

ziyaretci

 şimdi  benim istediğim

int metin_s_1[]={0b00000001,0b00000001,0b11111111,0b01100000,0b00011000,0b00111000};

bu dizideki bütün bilgileri kendi arasında sola kaydırmak
 
  1. bilgi 2. ile beslenecek,2. bilgi 3. ile , 3. bilgi 4. ile , 4. bilgi 5. ile , 5 .bilgi 6. ile , 6 . bilgi ise 1. bilgi ile. bunu yapmam lazım ama nasıl yardım edin arkadaşlar

Klein

şöyle olabilir.
shl ile kaydıracağız.
ilk elemanı kaydırmadan önce 7. bitin değerini bir yere kaydettik. Buna b1 diyelim.

1. elemanı kaydırdık.
2. elemanın 7. bitine baktık. eğer 1 ise  1. elemana 1 ekledik.
2. elemanı kaydırdık.
3. elemanın 7. biti 1 ise, 2. elemana 1 ekledk.
3. elemanı kaydırdık.
..
..
n. elmanı kaydırdık.
b1 1 ise n. elemana 1 ekledik.


10 baylık dizi olduğunu varsayalım.
kullanacağımız dizi uzunluğundan 1 fazla tanımlıyoruz.
char dizi [11]={.........};

fonk_kaydır(){
char i;
     dizi [10] = dizi [0] & 0x80;
     for(i=0;i<10;i++){
        dizi [ i ] <<=1;  // senin programında shift_left(dizi[i],1) olacak muhtemelen.
        if(dizi [ i+1 ] & 0x80) dizi [ i ] = dizi [ i ]+1;
     }
}

ziyaretci

mantığı anladım. fakat komut yolu olarak biraz açabilirmiyiz?

ziyaretci

 kardeşim kafam allak bullak oldu sabahtan beridir bununla uğraşıyorum. Biraz daha açabilirmiyiz  :(

Klein


kemalak

böyle dene  sanırım senin istediğin bu
56 defa  sola döndürürsen str dizisinde MERHABA yazısı  yeniden oluşur
Kolay gelsin



char str[8]={'M','E','R','H','A','B','A'};

//str[0] adreside dahil 7 baytı bir birine seri olarak bir bit sola döndür   
 rotate_left(&str[0],7);  //sola döndür (kapalı çember)

ziyaretci


kemalak

bayt başına 8 kaydırma  7 baytı döndürdüğümüze göre  7x8=56
Sen kaç bayt döndüreceksen ona göre hesapla

rotate_left(&str[0],5);  // burada str dizisindeki 5 baytın bitleri  tesbih taneleri gibi  bir bit sola döndürülür
8X5=40   döndürme sonunda  str dizisindeki baytlar  eski değerlerini alır

ziyaretci

@kemalak

  int metin_s_1[]={0b00000001,0b00000001,0b11111111,0b01100000,0b00011000,0b00111000};

yukarıdaki dizide istediğim gibi tam olarak ne yapmalıyım.

arslan74

Klein arkadaşımızın koduna ufak bir düzeltme yaptım. Bu şeikilde cok esnek kod oldu doğrudan al kullan.

// Test


unsigned char dizi1 [11]={0b10000001,1,2,4,8,16,32,64,128,3,0b10000001};
unsigned char dizi2 [11]={0b10000001,1,2,4,8,16,32,64,128,3,0b10000001};

void fonk_kaydir(unsigned char * dizi, unsigned char size){
	unsigned char i;

    for( i=0 ; i<size ;i++)
	{
    	dizi [ i ] <<= 1;  // solda ki byte i sola kaydır.
    	if((i < size-1)&&(dizi [ i+1 ] & 0x80))// Sağdaki son bit set edilmiş ise soldaki ilk biti set et.
    		dizi [ i ] |= 1;
    }
}


void main(void)
{	
	fonk_kaydir(dizi1,11);

	while (1);
	
}


Selamlar