C Öğreticisi 17 (Bit Alanları)
Last updated
Was this helpful?
Last updated
Was this helpful?
Bu yazılar adresindeki yazı dizilerinin çevirileridir.
C programınızın status olarak adlandırılan bir yapıda gruplandırılmış bir dizi TRUE / FALSE(doğru/yanlış) değişkeni içerdiğini varsayalım.
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
Bu yapı 8 bayt bellek alanı gerektirir, ancak gerçekte değişkenlerin her birinde 0 veya 1 değerini tutarız. C dili, bu gibi durumlarda bellek alanını kullanmak için çok daha iyi bir yol sunar.
Bir struct içerisinde bu değişkenleri kullanıyorsanız, C derleyicisine yalnızca bu bayt sayısını kullanacağınızı söyleyen bir değişkenin genişliğini tanımlayabilirsiniz. Örneğin, yukarıdaki yapı aşağıdaki gibi yeniden yazılabilir -
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
Yukarıdaki yapı, status değişkeni için 4 bayt bellek alanı gerektirir, ancak değerleri saklamak için yalnızca 2 bit kullanılır. Her biri 1 bit genişliğinde en fazla 32 değişken kullanırsanız, status yapısı 4 bayt kullanır. Bununla birlikte, 33 değişkeniniz olur olmaz, belleğin bir sonraki yuvasını tahsis eder ve 8 bayt kullanmaya başlar. Kavramı anlamak için aşağıdaki örneği inceleyelim -
#include <stdio.h>
#include <string.h>
/* basit bir yapı tanımlaması */
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1;
/* bit alanlarıyla bir yapı tanımlaması */
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main( ) {
printf( “status1 tarafından kullanılan bellek alanı : %d\n”, sizeof(status1));
printf( “status2 tarafından kullanılan bellek alanı : %d\n”, sizeof(status2));
return 0;
}
Kod derlenip çalıştırıldığında -
status1 tarafından kullanılan bellek alanı : 8
status2 tarafından kullanılan bellek alanı : 4
Bir bit alanının bildirimi bir yapı içinde aşağıdaki forma sahiptir -
struct {
tip [uyeAdi] : genişlik ;
};
Önceden tanımlanmış bir genişlikle tanımlanan değişkenlere bit alanları denir. Bir bit alanı tek bir bitten daha fazlasını tutabilir; örneğin, 0 ile 7 arasında bir değer depolamak için bir değişkene ihtiyacınız varsa, aşağıdaki gibi 3 bit genişliğinde bir bit alanı tanımlayabilirsiniz -
struct {
unsigned int yas : 3;
} Yas;
Yukarıdaki struct tanımı C derleyicisine yaş değişkeninin değerini saklamak için sadece 3 bit kullanacağını bildirir. 3 bitten fazla kullanmaya çalışırsanız, bunu yapmanıza izin vermez. Aşağıdaki örneği deneyelim -
#include <stdio.h>
#include <string.h>
struct {
unsigned int yas: 3;
} Yas;
int main( ) {
Yas.yas = 4;
printf( “Sizeof( Yas ) : %d\n”, sizeof(Yas) );
printf( “Yas.yas : %d\n”, Yas.yas );
Yas.yas = 7;
printf( “Yas.yas : %d\n”, Yas.yas );
Yas.yas = 8;
printf( “Yas.yas : %d\n”, Yas.yas );
return 0;
}
Yukarıdaki kod derlendiğinde bir uyarı ile derlenir ve yürütüldüğünde aşağıdaki sonucu verir -
Sizeof( Yas ) : 4
Yas.yas : 4
Yas.yas : 7
Yas.yas : 0