ESM-361 Mikroişlemciler 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN
Bit operatörleri Bit operatörleri bit düzeyinde işlem yapan operatörlerdir; yani sayıları bir bütün olarak değil, bit bit ele alarak isleme sokarlar. Bit operatörlerin aldığı değişkenlerin (operand'larin) türü tamsayı türlerinden olması gerekir (char, short, int, long), "float" ya da "double" türleri bu operatörlerle isleme sokulamaz.
Bit Değil (~) Operatörü Bit değil operatörü 1 e tümleme işlemi yapar. Yani 1 olan bit leri 0; 0 olan bit'leri 1'e dönüştürür. Örnek: unsigned int x = 0x1834; //işaretsiz tamsayı olarak x tanımlanıyor, 0x heksadesimal anlamında unsigned int y; // işaretsiz tamsayı tipi olarak y tanımlanıyor y = ~x ; // x'in bit düzeyinde değilim alınıp y değişkenine aktarılıyor Önce x içerisinde heksadesimal sistemde verilen sayıyı binary sisteme (bit düzeyine) dönüştürelim. x = 0001 1000 0011 0100 (1) (8) (3) (4) Simdi x'in bit olarak değimlini alalım. Bu işlem için 1'leri 0; 0'lari 1 yap maliyiz. ~x = 1110 0111 1100 1011 (E) (7) (C) (B) sonucu elde edilir.
Bit VE (&) Operatörü Karşılıklı bit'leri VE işlemine tabi tutar. Bit VE islemi mantıksal çarpma yapar. Örnek: x = 0xBB; Y = 0x1C; z = x &y; // x ve y değişkeni VE işlemine tabi tutulunca z değişkenin değeri soruluyor x ve y degiskenlerini binary (ikilik) sisteme çevirerek bit durumlarini inceleyelim. x = 1011 1000 Y = 0001 1100 (B) (8) (1) (C) Kars ilikli bit'ler üzerinde VE islemi yapılırsa; 1011 1000 x 0001 1100 y 0001 1000 x & y
Bit VEYA ( ) Operatörü Kars ilikli bit'ler üzerinde VEYA işlemini uygular. Bit VEYA mantıksal toplama islemi yapar. x = 0001 1111 1100 0000 (1FC0) y = 0001 0101 0011 1010 (153A) z = x y = 0001 1111 1111 1010 olur.
Bit ÖZEL VEYA (^) Operatörü Bu operand iki operandın karşılıklı bitleri aynı ise 0, farklı ise 1 değerini üretir. 0001 0101 1100 0100 a 0001 0010 1100 0101 b 0000 0111 0000 0001 a ^ b
Sola Öteleme (<<) Operatörü Sola öteleme operatörünün sol tarafındaki operand öteleme işleminin yapılacağı değişkeni ya da sabiti, sağ tarafındaki operand ise öteleme sayısını göstermektedir. degisken«öteleme sayısı Sola öteleme işleminde bütün bit'ler öteleme sayısı kadar sola kaydırılır. Kaydırma islemi sonunda en sağdaki bit sürekli sıfırla beslenir, en soldaki bit ise menzil dışına çıktığı için kaybolur. Örnek: a = 0xC9 b = a < < 1; // binary olarak 1100 1001 değerine eşittir. // a'nin 1 kere sola öteleneceğini belirtir. b=0x92 olur.
Sağa Öteleme (>>) Operatörü Sağa ötelemenin sola ötelemeden farkı yönünün ters olmasıdır. Sağa ötelemede sayi içerisindeki bütün bit'ler sağa kaydırılır. Örnek: a=0xc9 >> 1 Yeni deger a=0x64 olur.
Unary Operatörler C programlama dilinde diğer dillerde bulunmayan iki tane unary operatör vardır. Bunlar ++ ve -- dir. ++ operatörü, değişkenin tuttuğu sayıya 1 ekler. -- operatörü ise, değişkenin tuttuğu sayıdan 1 çıkarır. x++ x=x+1 x-- x=x-1 Unary operatörün iki kullanım sekli vardır. ++ ve -- operatörleri değişkenin önüne veya sonrasına koyulabilir. x=10; y=x++; y değişkeninin değeri y=10 olur. Çünkü program ilk önce x değerini y değişkenine aktarır daha sonra x değerinin 1 artırır. x=10; y=++x; y değişkeninin değeri y=11 olur. Çünkü program ilk önce x değerini 1 artırır daha sonra y değişkenine aktarır. Not: Ayni öncelik sırasına sahip operatörlerde program soldan sağa doğru sırayla işlem yapar.
Operatörlerin öncelik sırası (1) Operatör () []. -> ++ ++ +! ~ (type) * & sizeof Tanımı Fonksiyon Parantezleri Dizi Parantezleri Yapı elemanı Yapı elemanı Sondan arttırma ve azaltma (postfix) Önden arttırma ve azaltma (prefix) Tekil (unary) Toplama çıkarma Mantıksal Olumsuz, İkil (bitwise) olumsuz Tip değiştirme (Type casting) Gösterici değeri (reference) Adres değeri Boyut fonksiyonu Birleştirme Özelliği Soldan Sağa Sağdan sola * / % Çarpma Bölme Kalan Soldan Sağa + Toplama Çıkarma Soldan Sağa << >> İkil sola kaydırma, İkil Sağa kaydırma Soldan Sağa
Operatörlerin öncelik sırası (2) Operatör Tanımı Birleştirme Özelliği < <= Küçük, Küçük Eşit Soldan Sağa > >= Büyük, Büyük Eşit ==!= Eşit mi? Eşit Değiş mi? Soldan Sağa & İkil VE Soldan Sağa ^ Yahut (İkil Özel Veya (XOR)) Soldan Sağa İkil Veya Soldan Sağa && Mantıksal Ve Soldan Sağa Mantıksal Veya Soldan Sağa?: Üçlü Koşul Soldan Sağa = += -= *= /= %= &= ^= = <<= >>= Atama Toplama / Çıkarma ataması Çarpma / Bölme ataması Kalan / İkil ataması İkil / Mantıksal veya ataması İkil sola / sağa kaydırma ataması Soldan Sağa, Virgül (işlemleri ayırır) Soldan Sağa
Karşılaştırma Deyimleri C Programlama Dilinde bir koşulun doğru ya da yanlış olması ihtimallerine göre farklı kod veya kodların çalışmasını isteyebiliriz. Bu durumlarda karşılaştırma deyimleri kullanılır. Bu karşılaştırma deyimlerini 3 farklı yapıda kullanılabilir. if, if-else, iç içe if-else? Karşılaştırma Operatörü ile switch case yapısı ile
if, if-else Yapıları Bu yapılar, koşullu işlem yapan kontrol yapılarıdırlar. if ve else tek bir karşılaştırma deyimi olup else kullanımı isteğe bağlıdır. Eğer bir koşul olumlu ise if den sonraki bölüm yürütülür ve else den sonraki bölüm atlanır. Koşul olumsuz ise if den sonraki satırlar atlanır ve eğer varsa, else den sonraki işlemler gerçekleştirilir. if yapısının genel biçimi: if(koşul) {... işlem satırı;
if, if-else Yapıları if ile başlayan komut satırında if'den sonra yer alan parantezler içindeki koşul doğru ise (koşul sonucu 0'dan farklı ise) aynı satırda if yapısından sonra yer alan işlem satırı çalışır. Eğer koşul yanlış ise (ifade sonucu 0'a eşit ise) if yapısından sonra yer alan işlem satırı devre dışı kalır. Programımız o işlem satırı hiç yazılmamış gibi bir sonraki işlem satırından çalışmaya devam eder. Örnek: #include<stdio.h> int main() { int s1; //girilen sayimiz// printf("lütfen bir tam sayı giriniz: "); scanf("%d",&s1); if( s1 > 100 ) printf("girilen sayı 100'den büyüktür\n"); return 0;
if, if-else Yapıları if yapısının else ile genel biçimi : if(koşul) {... işlem satırı; (ifade1)... else {... işlem satırı; (ifade2)... else yapısı tek başına değil sadece if arkasından kullanılabilir. if satırında yer alan koşulun sonucu doğru ise, program if satırındaki işlem satırının gereğini yerine getirir, else satırını dikkate almaz. Eğer if satırında yer alan koşul yanlış ise, program if satırını dikkate almaz, else satırındaki işlem satırı devreye girer.
if, if-else Yapıları Örnek if else kullanımı : #include<stdio.h> int main() { int s1; printf("lütfen bir tam sayı giriniz: "); scanf("%d",&s1); if( s1 > 100 ) printf("girilen sayı 100'den büyüktür\n"); else printf("girilen sayı 100'den küçüktür\n"); return 0; Bir koşulun doğruluğunun if ile kontrolünü yaptırıp koşul karşılanıyorsa bir sonraki komut satırı devreye giriyor ve "Girilen sayı 100'den büyüktür" ekrana yazdırılıyor. Şayet verilen koşul yanlışsa, o zaman else satırı dikkate alınıyor ve ekrana "Girilen sayı 100'den küçüktür" yazdırılıyor. Ancak ikisini de yapması gibi bir durum söz konusu değildir.
if, if-else Yapıları if komut işlem satırındaki koşul doğru sonuç veriyorsa, program aynı satırda yer alan tek bir işlem satırını devreye almaktadır. Ancak iki veya daha fazla koşul kullanımında if komut işlem satırındaki koşul doğru sonuç verdiği zaman, program if yapısının hemen devamında gelen ({ ) işaretleri arasında bulunan komut işlem satırlarından oluşan kod bloğunun gereğini yerine getirir. Eğer koşul yanlış sonuç veriyorsa, program bu kez else yapısının hemen devamında bulunan ({ ) işaretleri arasındaki komut işlem satırlarından oluşan kod bloğunun gereğini yerine getirir. Yani if ve else deyimleri tek bir işlem satırının çalışmasını sağlayabilecekleri gibi aynı anda birden fazla işlem satırının da çalışmasını sağlayabilirler.
if, if-else Yapıları #include "stdio.h" int main() { int s1; printf("bir integer deger giriniz: "); scanf("%d", &s1); if(s1%2) { printf("girilen sayi tek bir sayidir\n"); printf("sayinin 3 kati : %d", 3 * s1); Örnekte integer bir değer girmemiz isteniyor. Girilen değer s1 değişkenine atanıyor. if satırında s1 değişken değerinin tek sayı olup olmadığı kontrolü yapılır. Tek bir sayı ise if koşuluna bağlı olarak tanımlanmış kod bloğu içindeki karakter dizisini ve değişken değerinin 3 katını hesaplayarak ekrana yazar. Sayı çift ise else satırına bağlı olarak tanımlanmış kod bloğu içindeki karakter dizisini ve değişken değerinin 2 katını hesaplayarak ekrana yazar. else { printf("girilen sayi cift bir sayidir\n"); printf("sayinin 2 kati : %d", 2 * s1); return 0;
if, if-else Yapıları Üç tamsayıyı okuyan ve bu üç tamsayının en küçüğünü bulup ekrana yazdıran bir C Programı yazınız #include <stdio.h>; int main () { int s1,s2,s3; int minvalue; printf("lutfen birinci tamsayiyi giriniz: "); scanf("%d", &s1); printf("lutfen ikinci tamsayiyi giriniz: "); scanf("%d", &s2); printf("lutfen ucuncu tamsayiyi giriniz: "); scanf("%d", &s3); if (s1<s2) minvalue = s1; else minvalue = s2; if (s3<minvalue) minvalue = s3; printf("en kucuk deger: %d \n", minvalue); return 0;
if, if-else Yapıları Klavyeden girilen harfin sesli harf olup olmadığını kontrol eden bir C Programı yazınız #include <stdio.h> #include <conio.h> int main() { char H = ' '; printf("\n Sesli Harf Kontrolu..."); printf("\n ==========================="); printf("\n Bir Harf giriniz :"); scanf("%c",&h); fflush(stdin); if( H == 'A' H == 'E' H == 'I' H == 'O' H == 'U' ) printf("\n %c Bir SESLI Harftir.",H); else printf("\n %c Bir SESLI harf Degildir.",H); return 0;
if, if-else Yapıları Bir yılın artık yıl olup olmadığını bulan bir C Programı yazınız #include <stdio.h> int main() { int y1; printf("bir yil girin: "); scanf("%d",&y1); if( y1 % 4 == 0 && y1 % 100!= 0 y1 % 400 == 0 ) printf("%d Artik Yil\n",y1); else printf("%d Artik Yil Degil\n",y1); return(0);
«switch case» Yapısı Bu yapı bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendirir. Switch deyiminden sonra kullanılan değişken veya ifadenin değeri, case ifadesinden sonraki değerlerden hangisine eşit ise oradaki komut veya komutlar işlem görür. Switch deyiminden sonra verilen ifade hiçbir case sabitine eşit olmazsa default seçeneği altındaki kodlar çalıştırılır. Her case ifadesi işlendikten sonra switch komutundan çıkmak için break fonksiyonundan faydalanılır. Switch komutundan sonra parantez içinde verilen değişken veya sabit «char» ya da «integer» tipi bir değer olabilir. «string» veya «float» olamaz. Aynı kural case ifadesinden sonra kullanılan sabit için de geçerlidir. case komutundan sonra sadece sabit bir değer kullanılabilir case (b-1) gibi bir ifade hatalıdır.
«switch case» Yapısı switch-case yapısı switch( degisken ) { case sabit1: komut(lar); break; case sabit2: komut(lar); break;... case sabitn: komut(lar) break; default: komut(lar);
«switch case» Yapısı
«switch case» Yapısı #include <stdio.h> int main() { int s1 =0; printf("lutfen bir sayi giriniz:"); scanf("%d", &s1); Örnekte girilen integer değer sayının 1 veya 2'ye eşit olup olmadığının kontrolü yapılmaktadır. Programa 1 veya 2 dışında bir değer girildiğinde ekran "Girilen sayi değeri geçersiz" ifadesi yazdırılmaktadır. switch (s1){ case 1: printf("girilen sayi değeri: 1\n"); break; case 2: printf("girilen sayi değeri: 2\n"); break; default: printf("girilen sayi değeri gecersiz \n"); break; return 0;
«switch case» Yapısı #include <stdio.h> int main() { char karakter; printf("lutfen bir karakter giriniz:\n"); karakter = getchar(); switch (karakter) { case 'a': printf("a karakterini girdiniz\n"); break; case 'b': printf("b karakterini girdiniz\n"); break; default: printf("a veya b karakterlerinden birisini girmediniz\n"); break; return 0;
«switch case» Yapısı #include <stdio.h> int main() { char takim; printf("lutfen bir karakter (b, f, g) giriniz:\n"); takim= getchar(); switch (takim) { case 'f': printf("fenerbahce\n"); break; case 'b': printf("besiktas\n"); break; case 'g': printf("galatasaray\n"); break; default: printf("b,f,g karakterlerinden birisini girmediniz\n"); break; return 0;