Sayfalar

Menü

11 Nisan 2021 Pazar

Bit alanları C programlama

 Bir yapının elemanı bit seviyesinde tutulan bir tamsayı değişken olabilir. Yapıların böyle

elemanlarına "bit alanı" (bit fields) denir.
Bit alanları, C'nin bit seviyesinde erişime olanak veren bir aracıdır. Bit seviyesinde erişim
amacıyla şüphesiz daha önceki konuda anlatılan bitsel işleçler kullanılabilir. Ancak bit
alanları programcıya böyle ulaşımlar için daha kolay bir arayüz sunar.
Bir yapı içinde bir bit alanı oluşturmak için özel bir sözdizim kuralına uymak gerekir.
Elemanın yapı içindeki bildiriminde eleman ismini ':' atomu izler. Bu atomdan sonra bit
alanının kaç bit yer kaplayacağı bilgisini gösteren bir tamsayı değişmezi yazılır. Aşağıdaki
bildirimi inceleyin:
struct Data {
unsigned int a: 5;
unsigned int b: 4;
unsigned int c: 7;
};
struct Data isimli yapının a isimli elemanı, yapı içinde 5 bit yer kaplarken, b isimli elemanı
4 bit, c isimli elemanı 7 bit yer kaplar. Yapının elemanları unsigned int türünden olduğuna
göre bu türden bir nesnenin
a elemanı 0 - 31
b elemanı 0 -15
c elemanı 0 - 127
arasında tamsayı değerler tutabilir.
Bit Alanı Elemanların Türleri
Bir bit alanı eleman, işaretli ya da işaretsiz int türlerden olabilir. Bir bit alanı eleman
gerçek sayı türlerinden olamaz. C standartları bit alanı elemanlarının char, short, long
türlerinden olamayacağını belirtse de C derleyicilerin çoğu seçimlik olarak bu duruma izin
verir. Taşınabilirlik açısından bit alanı elemanın bildiriminde signed ya da unsigned
sözcüklerinin kullanılması yerinde olur. Çünkü derleyici yalnızca int anahtar sözcüğüyle
bildirilen bir bit alanının türünü işaretli ya da işaretsiz int türü olarak alabilir.
Bit alanı eleman bir dizi olamaz.
Bit Alanları Neden Kullanılır:
Bazı dışsal aygıtlar verileri bitsel düzeyde iletiyor olabilir.
Bazı sıkıştırma işlemlerinde bir tamsayının belirli sayıda biti kullanılıyor olabilir.
Bazı şifreleme işlemlerinden bir tamsayının belirli bit alanlarında yapılan kodlama yapıyor
olabilir.
Çok sayıda bayrak değişkeni bit alanları olarak tutulabilir.
Şüphesiz bu işlemleri yapmak için bitsel işleçler de kullanılabilir. Ancak bit alanları bu
işlerin yapılması için programcıya çok daha kolay bir arayüz sunar, programcının işini
kolaylaştırır.
Örneğin DOS işletim sistemi dosyalara ilişkin tarih ve zaman bilgilerini 16 bitlik alanlarda
tutar:
struct file_date {
unsigned int day: 5;
unsigned int mon: 4;
unsigned int year: 7;
};
Yukarıdaki bildirimden de görüldüğü gibi, tarih bilgisinin yılı için 7 bitlik bir alan
ayrılmıştır. 7 bitlik bir alanda tutulabilecek en büyük değer 127 dir. DOS işletim
sisteminde böyle bir bit alanında yıl değerinin 1980 fazlası tutulur.
Aşağıdaki işlev file_date yapısı içinde tutulan tarih bilgisini ekrana yazdırıyor:
void display_file_date(const file_date *ptr)
{
printf("%02u/%02u/%u", ptr->day, ptr->mon, ptr->year);
}
Bir yapının bit alanı elemanlarına, yine nokta ya da ok işleçleriyle erişilir. Şüphesiz,
derleyicinin ürettiği kod bitsel işlemlerin yapılmasını sağlar.
Bu kez zaman bilgisini tutmak için elemanları bit alanları olan bir yapı bildiriliyor:
struct file_time {
unsigned int hour: 5;
unsigned int min: 6;
unsigned int sec: 5;
};
Zaman bilgisinin saniye değeri için 5 bitlik bir alan ayrılıyor. 5 bitlik bir alanda
tutulabilecek en büyük değer 31'dir. DOS işletim sisteminde, böyle bir bit alanında gerçek
saniye değerinin yarısı tutulur.
Aşağıdaki işlev file_time yapısı içinde tutulan zaman bilgisini ekrana yazdırıyor:
void display_file_date(const file_time *ptr)
{
printf("%02u:%02u%u", ptr->hour, ptr->min, 2 * ptr->sec);
}
Bitalanı Elemanların Adresleri
Bir bitalanı elemanın adresi alınamaz. Bir bit alanı elemanın adres işlecinin terimi olması
geçersizdir:
#include <stdio.h>
void func();
{
struct file_date fdate;
scanf("%d", &fdate.day); /* Geçersiz */
/***/
}
Bit Alanlarının Bellekte Yerleşimi
Bir bit alanının bellekte yerleşimi konusunda derleyiciler geniş ölçüde serbest
bırakılmıştır. Bit alanlarının bellekte yerleşimi "saklama birimi" (storage unit) isimli bir
terimle açıklanır. Saklama birimi, belirli bir byte uzunluğudur ve derleyicinin seçimine
bağlıdır. Örneğin derleyicinin seçtiği saklama birimi 1, 2, 4 vs. byte olabilir.
Bit alanlarının bildirimiyle karşılaşan derleyici bit alanlarını, aralarında boşluk bırakmadan
tek bir saklama birimine yerleştirmeye çalıştırır. Saklama biriminde bir bit alanı içinde
yeteri kadar yer kalmaz ise bir sonraki saklama birimine geçilir. Sığmayan elemanın her
iki saklama biriminde mi tutulacağı yoksa tamamen yeni saklama biriminde mi yer
alacağı derleyicinin seçimine bırakılmıştır. Bir elemanın ilgili bit alanı içinde yerleşiminin
soldan sağa ya da sağdan sola olması da yine derleyicinin seçimine bırakılmıştır.
Bir bit alanı uzunluğu saklama biriminin kendi uzunluğundan daha büyük olamaz.
Örneğin saklama birimi 8 bit ise 9 bitlik bir bit alanı eleman kullanılmaz.
Bit alanı elemanların yerleşimi üzerinde daha fazla denetimin sağlanması için, elemana
isim vermeme olanağı da getirilmiştir. Bir bit alanı elemana isim verilmeyebilir. İsmi
olmayan bir bit alanı elemanı içi derleyici yine gerekli yeri ayırır. Böylece programcı
kullanacağı elemanların içsel yerleşimini kendine göre ayarlayabilir.
typedef struct {
int : 5;
int hour : 5;
int min : 6;
}Time;
Yukarıdaki örnekte Time yapısının isim verilmeyen birinci elemanı için, derleyici yine 5 bit
ayırır. Yani yapının hour isimli elemanı 5. bitten başlayarak yerleştirilir.
Bir başka olanak da, bit alanı elemanın uzunluğunu 0 olarak belirlemektir. Bunun
önceden belirlenmiş özel bir anlamı vardır. Bir elemanın uzunluğunun 0 olduğunu gören
derleyici bir sonraki elamanı yeni bir saklama biriminden başlatır:
Aşağıdaki ilgili sistemin saklama birimi uzunluğu bit sayısı olarak elde ediliyor:
#include <stdio.h>
#include <limits.h>
typedef struct {
int : 1;
int : 0;
int : 1;
}StorageCheck;
int main()
{
printf("Saklama birimi = %u bit\n", sizeof(StorageCheck) / 2 *
CHAR_BIT);
return 0;
}
Yukarıdaki örnekte StorageCheck isimli yapı tanımlanıyor. Bu yapının isim verilmeyen ilk
bitalanı elemanı için 1 bit yer ayrıldığını görüyorsunuz. İkinci eleman için ise uzunluk 0
olarak belirleniyor. Son elemanın uzunluğu yine 1 bitdir. Derleyici 3. eleman için gereken
yeri bir sonraki saklama biriminden ayırır. Bu durumda eğer saklama birimi 8 bit ise
yapının toplam uzunluğu 16 bit, saklama birimi 16 bit ise yapının uzunluğu 32 bit nihayet
saklama birimi 32 bit ise yapının uzunluğu 64 bit olur.

Hiç yorum yok:

Yorum Gönder

Her yorum bilgidir. Araştırmaya devam...