Mantıksal oparetör hakkında

Başlatan cemilsivas, 03 Aralık 2019, 11:45:31

cemilsivas

Herkese merhaba.

RC522_Temp=n & RC522_irqEn & 0x01
Arkadaşlar bu ifadeyi sizler programlamada ne amaçla kullanırsınız?


RC522_Value=RC522_Value & (~RC522_BitMask)
Buradaki bitmask'ın önündeki ~ ifade ne işe yarıyor?

ete

RC522_Temp=n & RC522_irqEn & 0x01
bu ifadeye bakıp da ne amaçla kullanılır olduğuna karar vermek zor. Ama bu satırda ne yapıldığını açıklamak zor değil. RC522_TEM değişkeni, n sayısı ile RC522_irqEn sayısı ile AND işlemine sokuluyor. Sonucu tekrar 1 sayısı ile ayrıca AND işlemine sokuyor. Burada muhtemelen RC522_irqEn değişkeni kesme nin açık olup olmadığını kontrol ediyor olsa gerek. BU yalnızca bir tahmin tabiiki. En sonda yer alan 0x01 ifadesi 1 nolu bitin 1 olup olmadığını da test etmek amacı ile kullanılır. Kısaca N değişkenin 1 nolu bitini test ediyor gibi gözüküyor.

~ ifadesi invert etmek anlamına gelir yani ters çevirme diye tercüme edebiliriz. Sayı Byte cinsinden ise ~SAYI ise 255-SAYI anlamına gelir. Sayı WOrd cinsinden ise 65535-SAYI anlamına gelir.

Ete

cemilsivas


cemilsivas

#3
Hocam burada kod bloğunu verdim. Register değerinin ilk iki bitini 1 ya da 0 yapıyor.

Peki hocam bu işlem yerine bu register değerlerini direk 11 ya da 00 yapmakla ne farkı var?

Not: Kodu yoruma yazmaya çalıştığımda hata verdiği için böyle yapmak zorunda kaldım.


ete

Program tecrüben fazla olmadığından bu soruyu soruyorsun bunu anlıyorum.
Yapılan işin önemini anlayabilmen için sana bir örnek vereceğim.
PORTB de 8 adet led bağlı ve bu ledler bağımsız olarak yanıp sönmeleri gerekiyor.
Şimdi PORTB nin durumu şöyle olduğunu varsayalım.
PORTB=%11011100
dikkat edersen 0 ve 1 nolu btler LOW konumunda yani burada bağlı olan ledler sönük. Şimdi bu iki ledi yakmak istersem ne yapacağım. Senin sorduğun şekle göre PORTB=3 verirsem ne olur? diğer yanan ledler söner ve yalnızca ilk iki bite bağlı led yanar. Halbuki diğer yanan ledlerin şeklini bozmadan yalnızca bu iki ledi yakmak istiyorum. Bu durumda doğru şekil şöyle olurdu.
PORTB=PORTB | %00000011  bu komut önce PORTB yi okur ardından okuduğu değerin yalnızca ilk iki bitini set eder.
Benzer şekilde yaktığımız bu iki ledi tekrar söndürmek istersek
PORTB=PORTB ^ %00000011 komutunu vermemiz yeterli olacaktır. Böylece yine önce PORTB okunup okunan değer ile %00000011 XOR işlemine sokarsak, okunan değerdeki 1 olan bitler sıfır sıfır olan bitler ise 1 olacaktır. SOnuç olarak 8 veya 16 bitlik bir değerin yalnızca belirli bitlerine konum değiştirmek istersek SET etmek için OR (|) veya reset etmek için XOR (^) işlemine sokarız.
Boolen ifadelerine biraz göz gezdirirsen;
0 AND 0=0
1 AND 0=0   veya 0 AND 1=0
1 AND 1=1

0 OR 0=0
1 OR 0=1
1 OR 1=1

0 XOR 0=0
1 XOR 0=1  veya 0 XOR 1=1
1 XOR 1=0
birde bunların NOT (değil) olanları varki onlarda burada yazdıklarımın terslerini verirler.
Ete



Powered by EzPortal