Bit Field ها در زبان C
فرض کنید برنامه شما شامل یک ساختار با نام status و تعدادی متغیر عضو TRUE / FALSE باشد. مانند نمونه زیر:
1 2 3 4 | struct { unsigned int widthValidated; unsigned int heightValidated; } status; |
ساختار بالا در حالت عادی به 8 بایت از فضای حافظه نیاز دارد، اما ما فقط می خواهیم مقادیر 0 و 1 را در این دو متغیر ذخیره کنیم. در چنین شرایطی زبان برنامه نویسی C راه بهتری را ارائه می دهد. اگر از این متغیرها درون ساختار استفاده می کنید، می توانید تعداد بایت هایی که آن متغیرها می گیرند را تنظیم کنید. مانند نمونه زیر:
1 2 3 4 | struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status; |
ساختار بالا برای ذخیره متغیرها به 4 بایت از فضای حافظه نیاز دارد، اما برای ذخیره مقادیر این متغیرها فقط 2 بیت استفاده می شود. مثال زیر نحوه کارکرد Bit Field ها را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <string.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0; } |
زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 2 | Memory size occupied by status1 : 8 Memory size occupied by status2 : 4 |
اعلان Bit Field
شکل کلی اعلان Bit Field به صورت زیر می باشد:
1 2 3 | struct { type [member_name] : width ; }; |
توضیحات اعلان بالا را در جدول زیر مشاهده می کنید:
ردیف | توضیحات |
1 | type یک نوع integer می باشد که نوع تفسیر bit field را تعیین می کند. |
2 | member_name نام bit field را مشخص می کند. |
3 | width تعداد بیت در bit field را مشخص می کند، تعداد بیت ها باید کمتر یا برابر با type باشد. |
متغیری که با تعداد بیت مشخص شده تعریف شود، Bit Field نامیده می شود. یک bit field می تواند بیش از یک بیت را نگه دارد. مثلا اگر شما یک متغیر برای ذخیره یک مقدار از 0 تا 7 نیاز دارید، می توانید یک bit field با عرض 3 بیت به صورت زیر تعریف کنید:
struct
1 2 3 | struct { unsigned int age : 3; } Age; |
ساختار فوق به کامپایلر می گوید که متغیر age فقط 3 بیت برای ذخیره سازی مقدار استفاده می کند و امکان استفاده از بیش از 3 بیت وجود ندارد. مثال زیر این موضوع را به خوبی نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0; } |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 2 3 4 | Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0 |
عالی توضیح دادید.