İstenen Biti Gönderme

Başlatan M_B, 08 Mart 2008, 12:00:25

M_B

Mrb arkadaslar  bir dizi icindeki sayının istenen bitini nasıl cıkısa gonderebilirim.
Ornegin basicta soyle yapılmakta.     Sutun=Dizi[2]              E_Data=Sutun.2  Burda  Dizi[2] nin icindeki verinin 2. bitini ( Ne ise 0 veya 1 ) E_Data ya gonderiyor.
Bu işlemi C de nasıl yapabilirim. Ben  bir cozum yolu buldum ama ne kadar kararlı ve etkili bilmiyorum. Baska cozum yolu olan arkadaslar varsa onerilerini bekliyorum.
Tesekkurler
M_B

Benim cozum yolum su :

E_Data = (sutun[2]&0b00000010 )/2

4.bit icin ise
E_Data = (sutun[2]&0b00001000 )/8
sizce mantıklı ve dogrumu ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

titanium

değişken a, saptamak istediğin bitin nosu i olsun,

bit = (a >> i) & 0x01;


Dolayısıyla örneğin 4. bit için,

E_data = (sutun[2] >> 4)  & 0x01;


olacak.

Aşağıdaki de geçerlidir,

if(sutun[2] & (1 << 4))
  E_data = 1;
else
  E_data = 0;

F493

#include<htc.h> // 9.60
//sevgili titanium çok güzelaçıklamış

enum{FALSE,TRUE};

#define SIZE  2


unsigned const char _dATA[SIZE]={0X65,0X97};

//////////////////////////////////////////////
//bu fonksiyon ilgili bitin lojik durumuyla geri döner
bit  Bit_State(unsigned char val,unsigned char _bit)
{
     return   (val >> _bit) & 0x01 ? TRUE: FALSE;
}

////////////////////////////////////
//main fonksiyonu
void main(void)
{

    if( Bit_State(_dATA[0] , 5))
    :D  
      else
                 :(
      

     while(1) ;

   return;
}


//Bu şekilde global bir fonksiyon yazmış olursununuz, her yerde kullanabilirsiniz
//ve ilgili bitin lojik durumuyla geri döner..

arslan74

Merhaba,

Bunun için fonksiyon yazma gerek yok. Basid tanımalama da işinizi görebilir.

İstenilen biti set veya clear etmek için kullanabilirsiniz.
#define bitset(var,bitno)   ((var) |= 1 << (bitno))
#define bitclr(var,bitno)    ((var) &= ~(1 << (bitno)))



Test etmek içinse bu bildirimi kullanabilirsiniz.

#define bit_test(var,bitno)   ((var) & 1 << (bitno))


Selamlar

titanium

Alıntı yapılan: "arslan74"
Test etmek içinse bu bildirimi kullanabilirsiniz.
#define bit_test(var,bitno)   ((var) & 1 << (bitno))


Madem makrolardan bahsediyoruz şunu da eklemek lazım. Yukarıda verilen makronun kullanımı denildiği gibi sadece test etmek içindir. Yani
char a;
a = bit_test(value, 2);

gibi bir kullanım uygun değildir. Bu şekilde biti çıkışa yönlendirme işlemi hatalı olabilir. Aşağıdaki gibi yapılmalı,
if(bit_test(value, 2))
  a=1;

Yada aşağıdaki gibi yapılabilir.
#define get_bit(value, bit_no)  (value >> bit_no) & 0x01
//------
a=get_bit(value, 2);

Yeni başlayan arkadaşlar karıştırmasın diye belirtmek istedim.

kadirbas

Alıntı yapılan: "titanium"
Madem makrolardan bahsediyoruz şunu da eklemek lazım. Yukarıda verilen makronun kullanımı denildiği gibi sadece test etmek içindir. Yani
char a;
a = bit_test(value, 2);

gibi bir kullanım uygun değildir. Bu şekilde biti çıkışa yönlendirme işlemi hatalı olabilir. Aşağıdaki gibi yapılmalı,
if(bit_test(value, 2))
  a=1;

Yada aşağıdaki gibi yapılabilir.
#define get_bit(value, bit_no)  (value >> bit_no) & 0x01
//------
a=get_bit(value, 2);

Yeni başlayan arkadaşlar karıştırmasın diye belirtmek istedim.

titanium'un söylediğine ek olarak, şu gibi bir atama yapılabilir  :D

#define bitTest(val,bit)   (((val >> bit)&0x01)?1:0)

a = bitTest(value, 2);

Yeni başlayan arkadaşlar için şunu da eklemekte yarar var, "#define" bir ön işlemci komutudur. titanium, arslan74 ve benim yazdıklarım ise bu ön işlemci komutunu kullanarak yazılmış makrolardır. Makrolardan önce #define ön işlemci komutu ile ilgili bir açıklama yapmak gerekirse

#define SAYI   15

gibi bir tanımlama için bu tanımlamadan sonra, bu ön işlemci komutunun geçerli olduğu alan boyunca SAYI gördüğü yerlere 15 değeri yazılacaktır.

Bu satırları yazdıktan sonra farkettim ki ön işlemcileri bir kaç satırda anlatmak pek de mümkün değilmiş  :D Dolayısıyla makrolarla ilgili daha detaylı açıklama için yeni başlayan arkadaşlar forumu araştırsınlar. Forumda yoksa da yeni bir başlık açsınlar ve anlatalım  :D

picusta

Benim anlamadigim,
Arslan74'ün
#define bit_test(var,bitno)   ((var) & 1 << (bitno))

ile titaniumun
#define get_bit(value, bit_no)  (value >> bit_no) & 0x01

arasindaki fark ve niye arslan74'ün künü titaniumunkinin yerine kullanamadigimiz.
birisi 1 'i shift ediyor sonra degerle And yapiyor digeri degeri shift edip 1 ile and yapiyor. Aradaki farki sadece parantez olarak görüyorum?

titanium

Alıntı yapılan: "picusta"Benim anlamadigim,
Arslan74'ün
#define bit_test(var,bitno)   ((var) & 1 << (bitno))

ile titaniumun
#define get_bit(value, bit_no)  (value >> bit_no) & 0x01

arasindaki fark ve niye arslan74'ün künü titaniumunkinin yerine kullanamadigimiz.
birisi 1 'i shift ediyor sonra degerle And yapiyor digeri degeri shift edip 1 ile and yapiyor. Aradaki farki sadece parantez olarak görüyorum?
Bunu bir örnekle açıklamak en kolayı sanırım,

bit_test(12, 2);


Şimdi 1' i 2 bit sola kaydıralım,
Sonuç = 0b00000100
Bunuda 12 ile VE işlemine sokalım,
Sonuç = 4
Göründüğü gibi sonuç bir bit değildir. 0' dan büyük değerler için, bitin 1 olduğunu anlamış oluruz. Diğer makroyla arasındaki fark budur.

get_bit(12, 2);

Şimdi 12' yi 2 bit sağa kaydıralım,
Sonuç = 0b00000011
Bunuda 1 ile VE işlemine sokalım,
Sonuç = 1

Burada sonuç, bitin değeri olan 0 veya 1 dir.