XOR ve XNOR kapıları(operatörleri) ile if deyimi

XOR ve XNOR kapıları(operatörleri) ile if deyimi

XOR (eXclusive OR) Kapısı, girişindeki işaretler birbirinden farklı olduğu zaman çıkış olarak 1 verir, diğer tüm hallerde 0 verir.

XOR kapısının Boolean Cebiri eşitliği;

A xor B = A’B+AB’ şeklindedir.

XOR Kapısının doğruluk tablosu:

XOR’un Sembol gösterimi: daire içine alınmış “+” işaretidir.

Burada A ve B değerlerinin yalnızca birinin 1 olması durumunda çıkışı 1 olur.

Bunu günlük hayatla örneklersek:

Motosikletle gideceksiniz,tek başınıza gidemezsiniz, 2 arkadaşınız var sizle gelebilecek…
Motosiklet 2 kişilik.
Ahmet ve Ali ikisi birden gelirse gidemezsiniz.
Ahmet gelecek ya da Ali gelecek.
Hiçbiri gelmezse yine gidemezsiniz, yanınızda birisi olsun istiyorsunuz.

XOR=”ya da” demektir

C ve C++ dillerinde “ya da” nın  anlamı ^ işaretidir.

if((ali==1) ^ (ahmet==1)) şeklinde kullanabiliriz

burda Ali’nin gelme durumu ali==1, Ahmet’in gelme durumu ahmet==1 ile kontrol edilmiştir.

Böyle yazarsak yine aynı anlama gelir:  if(ali ^ ahmet)

if(ali ^ ahmet)
{
gidebilirim();
}
else
{
gidemem();
}

XOR kapısının en güzel kullanımlarından biri de aynı boyuttaki iki değişkenin yerini, üçüncü bir değişken kullanmadan değiştirmektir.

a ve b diye iki sayımız olsun, ^ ise bitwise xor işlemi olsun;

a’nın değerini b ye, b’nin değerini a’ya atmak yani iki değişkenin değerlerini bir biri ile takas etmek için(swap işlemi)

Aşağıdaki 3 komutu uygularız.

a = a^b;

b = b^a;

a = a^b;
//kısaca tek satırda yazabiliriz böyle: a ^= b ^=a ^=b;

 

Peki ne yaptık burada? İkinci satırda b = b^a derken ilk baştaki elemanlar cinsinden şunu dedik:

yeni b = b^(a^b) yani kısaca a.

aynı şekilde son satırda yeni a = (a^b)^(b^(a^b)) = b oldu.

Örnek verecek olursak:

a sayısı 4 bitlik binary tabanda 1011 olsun (yani 10 luk tabanda 11 sayısına denk geliyor)

a sayısı 4 bitlik binary tabanda 1100 olsun(yani 10 luk tabanda 12 sayısına denk geliyor)

a=1011^1100  ====> a’nın yeni değeri 0111 olur yani 7 olur.

b=1100^0111====>b’nin yeni değeri 1011 olur yani 11 olur. (a’nın değerini b’ye almaya başardık)

a=0111^1011====>a’nın yeni değeri 1100 olur yani 12 olur. (b’nin değerini a’ya almaya başardık)

Haddizatında toplama çıkarma işlemi ile de yer değiştirmek mümkündür.

int x=5,y=7;
y = x + y; //şu anda: x = 5, y = 5 + 7
x = y - x; //şu anda: x = 7, y = 5 + 7
y = y - x; //şu anda: x = 7, y = 5

Aklınızda bulunsun:

XOR kapısının dışında XNOR kapısı diğer adıyla NXOR kapısı vardır. Açılımı “exclusive not or” dur.  Bu kapının mantığı XOR ile aynıdır. Fakat sonuç kısmında çıkan değerin tersi alınır. 1 ise 0, 0 ise 1 dir. Yani;

XNOR kapısının Boolean Cebiri eşitliği;

A xor B = AB+A’B’ şeklindedir.

Kısaca, “output”u; inputların carpımları ile inputların “not”larının carpımlarının toplamıdır.

Bu kapı ne amaçla kullanılabilir?

Bu “gate” aldığı iki inputu kontrol eder ve birbirinin aynısı ise outputu 1 yapar aksi takdirde 0 . Yani inputların eşit olup olmadığına bakar.

XNOR Kapısının doğruluk tablosu:

Eğer 2 sayıyı xor işlemime tabi tutup, sonucunun tersini alırsak, XNOR işlemi yapmış oluruz.

XNOR’un felsefesi: “Ya hep ya hiç…”

6 thoughts on “XOR ve XNOR kapıları(operatörleri) ile if deyimi

  1. Yazmayı unutmuşum,
    1 Bitlik bilgiyi terslemek için de XOR kullanabilirsiniz.

    A=A^1;

    Yazarsanız A’yı terslersiniz.
    Bu ifadeyi C dilinde daha kısa yazmak mümkün:

    A^=1; 

    Kullanabileceğiniz şekliyle örnek vermek gerekirse:

    LATAbits.LATA5^=1;

    yazarsanız LATA register’ının A5 biti terslenir. Yani 1 ise 0 olur, 0 ise 1 olur.

  2. Gökhan merhaba,

    XOR için “veya” demen garip geldi.Sanki daha çok özel veya olacak gibi ismi.Yani A veya B işlemi için A | B şeklinde ifade edilmez mi?Yani veya operatörü ” | ” olarak bilinmez mi?

  3. Merhaba Muhammed kardeşim, haklısın ama XOR için “veya” demedim ki, yukarda XOR=”ya da” demektir diye yazmışım dikkat edersen. Bildiğin gibi, “ya da” ve “veya” farklı şeyler.

  4. Merhaba Gökhan,
    XOR ve NXOR mantık operatörlerini hatırlamak için google da arama yaparken blogundan faydalandım. Sadece bir konuda öneride bulunmak istiyorum. Yazılım ve elektronik konularında çalışan veya uğraşan arkadaşların -bende dahil- hepimizin ortak sorunu, yeterince Türkçe içerik bulamaması yahut yeterli olmamasıdır. Fakat çoğu kez şöyle bir durumla da karşılaşıyorum. Türkçe içerik paylaşan arkadaşlar yazılarında dilimizi birazcık daha dikkat ederek yazarlarsa çok daha verimli olacaklarına eminim. Bunu yalnızca Sana değil, aslında hepimize bir uyarı olarak iletmek istiyorum. Çünkü açıkça konuşmak isterim ki; çoğu zaman kendi anadilimde yazılan makaleleri anlamak, neredeyse imkansız hale geliyor. Yabancı bir lisanda makale okumak daha rahat olabiliyor. Bunun bence yegane sebebi, yabancı terimleri türkçeleştirmek yerine daha ziyade olayın esas mantığını kavratacak kısmı güzel bir türkçeyle anlatmak kafi olacaktır. Örnek olması bakımından şu kısmını paylaşıyorum:

    ‘Kısaca, “output”u; inputların carpımları ile inputların “not”larının carpımlarının toplamıdır.’

    Bu yorumu yazarken seni yapıcı olarak eleştirmek istedim. Yoksa aynı hatalara hepimiz düşebiliyoruz.Sonuçta ben de dilbilimci değilim, yalnızca elimden geldiği kadar dikkat etmeye çalışıyorum. Hepimiz gayret etmeliyiz. Daha çok içerik üretip ve paylaşarak tabi herkesin rahatça anlayabileceği şekilde. Yoksa bu yazdığını bu konulara aşina olan hemen herkes algılayabiliyor. Fakat üretilen bilgi ya da içerik yapıcı olmaktan uzaklaşıyor.
    Çalışmalarında başarılar dilerim,
    Kolay gelsin.

    • Bu arada bende hata yaptım “XNOR” diyeceğime “NXOR” yazdım. Dediğim gibi mükemmel değiliz fakat yanlışlarımızdan ders çıkarıp kendimizi doğru olanı yapmaya alıştırmamız gerek. 🙂

Bir Cevap Yazın