c bitsel operatörler

Başlatan ido2323, 03 Ağustos 2015, 15:38:54

ido2323

Hayırlı günler,c ile atmel çalışıyorum anlayamadığım bazı işlemler var, yardımcı olursanız sevinirim.


Burada tam olarak ne demek istiyor, c ne değer alırsa ne olur.
if(c & 0x80) LCD_D4=1; else LCD_D4=0;



Burada ne olur.
#define    kukla ((LCD_EN = 1),(LCD_EN=0))
kukla;


harfin önüne "*" gelince ne olur.
while(*s)

Son olarak &= ile |= için bitsel işlemli atama operatörleri deniliyor peki arasındaki fark nedir?
PORTC |= (1<<PC0); //Turns ON LED
PORTC &= ~(1<<PC0); //Turns OFF LED

JKramer

https://en.wikipedia.org/wiki/Bitwise_operations_in_C
Bu ve diğer sorularınız için temel bir C kitabı üzerinden çalışsanız daha sağlıklı olur.

ido2323


Gökhan BEKEN

#3
Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
Burada tam olarak ne demek istiyor, c ne değer alırsa ne olur.
if(c & 0x80) LCD_D4=1; else LCD_D4=0;
c değişkenini 0x80 ile and işlemine tabi tutuyor, sonuç 0'dan farklı ise LCD_D4=1; işlemini gerçekleştiriyor, eğer sonuç 0 ise yani if'den false dönerse LCD_D4=0; işlemi yapılıyor.

Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
Burada ne olur.
#define    kukla ((LCD_EN = 1),(LCD_EN=0))
kukla;
Böyle bir kullanım anlamsız geldi bana.


Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
harfin önüne "*" gelince ne olur.
while(*s)
O değişkenin pointer olduğunu belirtir. Daha doğrusu ordaki s değişkeni bir pointer olduğu için adres barındırıyor, başına * koyunca o adresteki veriyi okuyup  0 dan farklı mı diye kontrol ediyorsun.


Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
Son olarak &= ile |= için bitsel işlemli atama operatörleri deniliyor peki arasındaki fark nedir?
PORTC |= (1<<PC0); //Turns ON LED
PORTC &= ~(1<<PC0); //Turns OFF LED
and ve or işlemlerini bilmeniz gerekiyor: http://gokhanbeken.com/if-deyiminde-xor-kullanmak
bitwise işlemlerini öğrenin : http://gokhanbeken.com/bitwise-islemleri

Şimdilik cevaplamaya çalıştım ama mutlaka bir kitaptan çalışmalısınız.
Özel mesaj okumuyorum, lütfen göndermeyin.

gkeskin

Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
Burada tam olarak ne demek istiyor, c ne değer alırsa ne olur.
if(c & 0x80) LCD_D4=1; else LCD_D4=0;

(c & 0x80) işlemi bitsel olarak mantıktaki "ve" işleminin uygulanmasını sağlar. Aslında yukarıdaki arkadaşın da söylediği gibi bitwise işlemlerini öğrenmeniz gerekiyor. Fakat bu örneğinizi biraz detaylı açıklamam yararlı olur düşüncesiyle işlemin ne olduğunu açıklamaya çalışacağım.

Mantıktaki "ve" işlemini bildiğinizi varsayıyorum ve örneği açmaya başlıyorum. 0x80 değerindeki 0x ön eki sayının on altılık sayı sisteminde ifade edildiğini belirtir. Bu sayının onluk sistemdeki karşılığı

0x80 = 8 x 16^1+0 x 16^0=128 olur.

Bu değer bellekte ikilik sistemde aşağıdaki gibi tutulacaktır.

10000000

c değişkeninin farklı değerleri için sonuçlara bakalım:

c = 0x80; olsun. Bu durumda c de aşağıdaki gibi ifade edilir:

10000000

Her iki değerin karşılıklı bitleri için "ve" işlemi uygulandığında;

Soldan 1. bit --> 1 & 1 = 1
Soldan 2. bit --> 0 & 0 = 0
Soldan 3. bit --> 0 & 0 = 0
...

Sonuç olarak (c & 0x80) işleminin sonucu ikilik sistemde "10000000" olacaktır ve bu da 0x80 değerine eşittir. C'de 0 dışındaki değerler doğru kabul edildiği için "LCD_D4=1;" komutu çalıştırılacaktır.

c değişkeninin değeri 0x40 olsun:

Bu durumda c'nin değeri 4 x 16^1+0 x 16^0=64'tür ve bunun ikilik sistemdeki karşılığı "01000000" olur.

Bit işlemi olan "ve"yi burada uygulayalım.

Soldan 1. bit --> 0 & 1 = 0
Soldan 2. bit --> 1 & 0 = 0
Soldan 3. bit --> 0 & 0 = 0
Soldan 4. bit --> 0 & 0 = 0
...

Sonuç olarak (c & 0x80) işleminin sonucu ikilik sistemde "00000000" olacaktır ve bu da 0x00 değerine eşittir. C'de 0 değeri yanlış kabul edildiği için "LCD_D4=0;" komutu çalıştırılacaktır.

Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
Son olarak &= ile |= için bitsel işlemli atama operatörleri deniliyor peki arasındaki fark nedir?
PORTC |= (1<<PC0); //Turns ON LED
PORTC &= ~(1<<PC0); //Turns OFF LED

Bu işlemleri şu şekilde düşünecek olursanız (eşittir işaretlerini sildim) yukarıdaki örnek ile benzer olduğunu görebilirsiniz.

PORTC | (1<<PC0); //Turns ON LED
PORTC & ~(1<<PC0); //Turns OFF LED

İlk satırdaki | sembolü bitsel olarak mantıktaki "veya" işlemini yapmaya yarar. İlk satırda PORTC değişkeninin değeri ile (1<<PC0) işlemi sonucunda oluşacak değer bitsel olarak "veya" işlemine tabi tutulur, ikinci satırda ise PORTC değişkeninin değeri ile ~(1<<PC0) işlemi sonucunda oluşacak olan değer bitsel olarak "ve" işlemine tabi tutulur. Bu iki işlemde de sadece işlem yapılır ve bir sonuç ortaya çıkar. Sizin örneğinizdeki gibi eşittir işaretleri de kullanıldığında ise işlem sonucunda oluşan değer soldaki değişkene yani PORTC'ye atanır.

Alıntı yapılan: ido2323 - 03 Ağustos 2015, 15:38:54
harfin önüne "*" gelince ne olur.
while(*s)

Buradaki * işlemi işaretçiden değer okuma işlemidir. İşaretçi bir değişkenin adresini tutan bir başka değişkendir. Örneğin bir "x" değişkeni tanımlanmış olsun "s" değişkeni de x değişkeninin bellekteki adresini tutsun. Bu durumda *s ifadesinin değeri x'in değerine eşittir. İşaretçi konusu biraz karmaşık, biraz daha araştırma yapmanız daha yararlı olacaktır.