C proqramlaşdırmada bit sahələri

Bit sahələri

Fərz edək ki, şəxsiyyət vəsiqəsi və aşağıdakı kimi yaşı olan bir Tələbə quruluşumuz var.

typedef struct Student {
	int StdId;
	int Age
}STD;

Burada StdId tam olaraq elan edilir və ümumiyyətlə imzasız dəyərdir. Beləliklə, 8 bayt yaddaş tutacaqdır. Eynilə Yaş da pozitiv bir ədədi təşkil edir və bu səbəbdən 8 bayt yaddaş tutur. Praktikada həm İd, həm də Yaş 8 bayt yaddaş tutmayacaq. Tam ədədin tutulacağından daha az yaddaş tələb edir. Tutaq ki, tələbə id 1-dən başlayır və maksimum 100 götürə bilər. Sonra 1100100 bit - 8 bayt yaddaş olan 1 olaraq saxlanılır. Ancaq 8 baytlıq bir yer yaradırıq. Bu yaddaş itkisidir. Proqramın istifadə etdiyi yaddaşı səmərəli idarə etmək üçün C tam dəyişənlərin tutduğu yaddaş yerini bitlərlə məhdudlaşdırmağa imkan verir. yəni;
typedef struct Student {
	int StdId : 8;
	int Age: 4;
}STD;

Yuxarıda göstərilən kod kompilyatora bildirir ki, StdId tam olaraq elan olunsa da və 8 bayt yer tuta bilsə də, onun tutduğu yaddaşı 8 bit və ya 1 baytla məhdudlaşdırır. Eynilə yaş 4 bitlə məhdudlaşır. Orijinal yaddaş ölçüsündən daha az görünsə də, çox sayda məlumat dəyəri saxlaya bilər. Bu o deməkdir ki, 8 bit 28 dəyər saxlaya bilər ki, bu da indi bizim üçün kifayətdir. Eynilə, yaş da 24 dəyər saxlaya bilər.

Məsələn, 0-dan 16-a qədər yaşı və 0-dan 256-dək tələbə idini saxlaya bilərik.

Dəyər sayını daha az dəyərlə məhdudlaşdırdığımızdan, bundan daha böyük bir dəyər saxlaya bilmərik. Yəni, yaşı 17 və ya daha çox kimi saxlamağa çalışsaq, bu, onları saxlamağımıza imkan verməyəcəkdir. Onları sıfır hesab edəcək.

Bit sahə dəyişənlərinin saxlanılması üçün ümumi sintaksis:

struct {
	type member_variable_name: size_in_bits;
}

Type, int, char, float və s. Kimi hər hansı bir məlumat növü olduğu halda member_variable_name strukturun üzv adıdır və size_in_bits quruluşdakı üzvün təyin olunmuş ölçüsüdür.

Yuxarıda tələbə quruluşunda bit sahəsi olmayan strukturun ölçüsü (StdId) + ölçüsü (Yaş) = 8 bayt + 8 bayt = 16 baytdır. Üzvlərinə bit sahələrini istifadə etdikdən sonra 8 bit + 4 bit = 12 bit = 1.5 baytdır və bu çox azdır. Beləliklə, yaddaşa çox qənaət edə bilərik.

#include 

void main(){
	typedef struct Student_NoBit {
		int StdId;
		int Age;
	}STD_NOBIT;

	typedef struct Student {
		int StdId : 8;
		unsigned int Age : 4;
	}STD;

	STD_NOBIT std_nb;
	STD std;

	printf("\nSize of  Student structure without bitfield: %d\n", sizeof(std_nb));
	printf("Size of  Student ID without bitfield: %d\n", sizeof(std_nb.StdId));
	printf("Size of  Student Age without bitfield: %d\n", sizeof(std_nb.Age));
	printf("Size of  Student structure with bitfield: %d\n", sizeof(std));

	std.Age = 15; // this member can store max of 15 numbers from 0-15
	printf("Age of the Student with bitfield: %d\n", std.Age);

	std.Age = 17; // Since it is more than 15, it starts displaying the remainder values
	printf("Age of the Student with Bitfield: %d\n", std.Age);
}

Nəzərə alın ki, ölçüsü bit olan dəyişənin ölçüsünü tapmaq üçün sizeof operatorundan istifadə edə bilmərik. Xahiş edirəm bit sahələri olan və olmayan sahələr arasındakı fərqə diqqət yetirin. Üzv elementlərin bitlərinə əsaslanan dəyəri necə göstərdiyini də görün. Burada Yaş 0-dan 15-ə qədər olan bit sahəsinin ölçüsü 4 olduğu üçün saxlaya bilər. Beləliklə, dəyəri 15-ə çatana qədər dəyərləri düzgün şəkildə göstərir. Bu rəqəmin üstündə göstərilməyə çalışarkən qalan dəyərləri göstərir.

Şərh yaz

Translate »