Bit Alanları

C'de bir byte'ın farklı bitleri farklı amaçlar için kullanılabilir. Fakat bellekte sadece byte'ların adresleri vardır. Bitlerin adresleri alınamaz. Bit alanarı yapılar veya birlikler içinde ve şu şekilde tanımlanır:

struct yapı_ismi{
veri_tipi bit_alanı_ismi1: bit_sayısı1;
veri_tipi bit_alanı_ismi2: bit_sayısı2;
veri_tipi bit_alanı_ismi3: bit_sayısı3;
veri_tipi bit_alanı_ismi4: bit_sayısı4;
...
}değişken_ismi;

Burada veri tipi kesinlikle intsigned int veya unsigned int olmalıdır. C99'da bu tiplere bool tipi de eklenmiştir. Ayrıca bitlerin adresleri alınamadığı gibi bit alanlarıyla dizi de oluşturulamaz. Bir yapı tanımı içinde hem bit alanları hem de normal yapı elemanları karışık olarak kullanılabilir. Bir bit alanına şu şekilde erişilir:

"yapı_değişkeni_ismi.bit_alanı_ismi"

Bit alanlarının adresleri alınamasa da bit alanlarının içerisinde bulunduğu yapı değişkenlerinin adresleri alınabilir ve bu adresi tutan bir p işaretçisi aracılığıyla bir bit alanına erişim ise yine aynen normal yapı elemanlarında olduğu gibi olur:

p->bit_alanı_ismi

#include <stdio.h>

struct shop{
    short int daily;
    unsigned int monday: 1;
    unsigned int tuesday: 1;
    unsigned int wednesday: 1;
    unsigned int thursday: 1;
    unsigned int friday: 1;
    unsigned int weekend: 2;
};

float f(struct shop x);

int main(void){
    struct shop gokhan;
    gokhan.daily=70;
    gokhan.monday=1;
    gokhan.tuesday=1;
    gokhan.wednesday=1;
    gokhan.thursday=0;
    gokhan.friday=1;
    gokhan.weekend=1;
    float weekly=f(gokhan);
    printf("%f",weekly);
    return 0;
}

float f(struct shop x){
    int y=x.monday+x.tuesday+x.wednesday+x.thursday+x.friday;
    float z;
    switch(x.weekend){
        case 0:
            z=0;
            break;
        case 1:
            z=1.5;
            break;
        case 2:
            z=4;
            break;
    }
    return x.daily*(y+z);
}

Yukarıdaki örnekte bir marketin çalışanları için uyguladığı maaş politikasına göre haftalık ücret hesaplaması verilmiştir. Günlük ücret $70 olarak belirlenmiştir. Hafta sonunda bir gün gelinmesi durumunda günlük ücretin 1,5 katı, 2 gün gelinmesi durumunda ise her gün için günlük ücretin 2 katı verilmektedir. Çalışanın gelip gelmediği bit alanlarında depolanmıştır. Hafta içi günlerinin her biri için 1 bit kullanılırken, hafta sonunun tamamı için 2 bit kullanılmıştır. Yukarıdaki örnek aynı zamanda yapı içinde hem normal elemanların hem de bit alanlarının aynı anda kullanımını da göstermektedir.

Eğer bit alanları signed olarak kullanılırsa kendi içindeki en yüksek bitin kuvveti eksili olacaktır. Yani bir diğer deyişle bit alanımızın n bitlik yer tuttuğunu varsayalım. Bu durumda bu bit alanına girdiğimiz veriler bitlerde şu şekilde tutulacaktır:

\(b_{n}\times-2^{n-1}+b_{n-1}\times2^{n-2}+b_{n-2}\times2^{n-3}+...\)

Bu nedenle n bitten oluşan bir bit alanının alabileceği değerler \((-2^{n-1},2^{n-1}-1)\) aralığında olacaktır. Yukarıdaki örneğimizde hafta içi günleri bit alanarı için bit sayısının 1 (n=1) ve hafta sonu günleri bit alanı için bit sayısının 2 (n=2) olduğu göz önüne alınırsa, bu bit alanları için unsigned yerine signed tipi kullanılsaydı hafta içi bit alanıın sınırları -1 ve 0 hafta sonu bit alanının sınırları -2 ve 1 olacaktı. Bu durumda hesabımız için gerekli sayıları bu bitlerde tutamayacaktık. Bit alanları kullanılırken bunlara da dikkat edilmelidir.




Birlikler <<<<< Temel C >>>>> Listeler