Bitler üzerinde işlem yapabilen operatörler yardımıyla bir datanın belirli bir bitine ya da bit grubuna erişmeyi sağlayan, maskeleme adı verilen bir programlama tekniği uygulayabiliriz. Bu teknik özellikle veri sıkıştırma ve indeks yaratma uygulamalarında çok sık kullanılır.
Aşağıdaki program yardımıyla 16 sorudan oluşan bir testin cevaplarına Doğru veya Yanlış şeklinde cevap verileceği düşünülerek, değerlendirme yapılmaktadır. Doğru d veya D, yanlış y veya Y ile simgeleniyor.
#include <stdlib.h>
#define DOGRU_CEVAP 0x3E1D
#import <Foundation/Foundation.h>
#include <math.h>
int main(int argc, char* argv[])
{
extern float sinav(int cevap);
extern int cevaplar();
int sonuc;
NSLog(@"\nCevaplari giriniz : \n");
sonuc = sinav(cevaplar());
NSLog(@"\nAlinan not =%3.0i \n", sonuc);
exit(0);
}
int cevaplar()
{
int cevap = 0;
int i;
char k;
for (i= 0; i<=15; i++)
{
k= getchar();
if(k == 'd' || k == 'D')
{
cevap = cevap|(1 << i );
}
}
NSLog(@"\nGirilen cevaplar --- %X", cevap);
return cevap;
}
/* Doğru cevaplar*/
/* YYDD DDDY YYYD DDYD*/
/* 0011 1110 0001 1101 */
float sinav(int cevap)
{
int y_bit;
extern int bit_say(int y_bit);
int sonuc;
y_bit = cevap^DOGRU_CEVAP;
NSLog(@"\ncevap=%x",cevap);
NSLog(@"\nDOGRU CEVAP=%x",DOGRU_CEVAP);
sonuc = 100 * ((16 - bit_say(y_bit)) / 16.0);
return sonuc;
}
int bit_say(int l)
{
int i, s=0;
for (i=0; i<=15; i++)
if (l & (1<<i)) ++s;
return s;
}
PROGRAMIN ÇIKTISI:
AÇIKLAMA:
Programı çalıştırdığımızda:
Cevapları giriniz...
mesajı gelecektir. \n ifadesinden ötürü imleç bir alt satıra geçer. Cevapları DYDDDYYYYDDDYYDD şeklinde girip Enter’a basalım. Cevap değişkeni şu aşamalardan geçecektir:
İlk cevap doğru:
Cevap = 0 ⎜1 << 0
= 0 ⎜ 1 0000 0001
= 00000001
Üçüncü cevap doğru :
Cevap = 0000 0001 1 << 2
0000 0100
Cevap = 0000 0101
sonuçta cevap dizisinde D’ler yerinde 1, Y’ler yerinde 0’lar olacaktır.
Cevap = 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1=D D Y Y D D D Y Y Y Y D D D Y D
sınav() fonksiyonu ise oluşturulan cevap bit dizisi ile DOGRU_CEVAP’ı XOR (^) işlemine sokmaktadır.
Sonuçta;
y_bit=1100111000011101 ^ 0011111000011101
işlemi yapılacak ve
y_bit=1111 0000 0000 0000
olarak bulunacaktır. Doğru cevap anahtarında en sağdaki değerin ilk, en soldaki değerin son soruya ait olacağına dikkat edelim. Bu değer bit_say adlı fonksiyona gönderilerek sırayla
i=0 iken
1111 0000 0000 0000 & 0000 0000 0000 0001
1111 0000 0000 0000 & 0000 0000 0000 0010
::: :::
::: :::
1111 0000 0000 0000 & 0001 0000 0000 0001
1111 0000 0000 0000 & 0010 0000 0000 0001
:
işlemleri yapılır, sadece son dört adımda if(l&(1<<i)) koşulu doğru olacağı için s=4 bulunur (S doğru cevap anahtarına uymayan soruları sayıyor).
sonuç=100*(16-4)/16.0=75
olarak bulunacaktır. Bu örnekte gerçekte 16 byte yer kaplayacak olan bir cevap dizisi 16 bit’ lik bir int içine sıkıştırılmaktadır.
getchar() Fonksiyonu
Yukarıdaki örnek uygulamamızda bu kodun yer aldığını görmüş olmalısınız. Peki ne anlama geliyor, ne iş yapar? Bu bir C++ fonksiyonudur ve eğitimin Fonksiyonlar başlığında diğer fonksiyonlarla birlikte anlatılmıştır. Fakat bu noktada örnek kodun daha iyi anlaşılabilmesi adına değinmekte fayda var.
Aslında bu fonksiyonun çok basit bir işlevi vardır. Kullanıcının girdiği bir karakter okunur ve program istenen bir yerde durdurulup, karakter girilene kadar bekletir. Programın kullanıcısından klavyeden girilecek harfleri bekler. Yukarıdaki örnek kodda uyguladığımız şekilde açıklayacak olursak; kullanıcıdan 15 defa harf girişi isteyecek, kullanıcı 'd' ya da 'D' harflerini girip girmeme durumuna göre kişinin doğru ya da yanlış yapıp yapmadığına karar vererek diğer işleme geçecek.
for (i= 0; i<=15; i++)
{
k= getchar();
if(k == 'd' || k == 'D')
{
cevap = cevap|(1 << i );
}
}