ในส่วนนี้เราจะพูดถึง bit field ใน C.
สมมติว่าโปรแกรม C ของคุณมีตัวแปร TRUE/FALSE จำนวนหนึ่งที่จัดกลุ่มในโครงสร้างที่เรียกว่าสถานะดังนี้ –
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status; โครงสร้างนี้ต้องการพื้นที่หน่วยความจำ 8 บิต แต่ในความเป็นจริง เราจะเก็บ 0 หรือ 1 ไว้ในแต่ละตัวแปร ภาษาการเขียนโปรแกรม C เป็นวิธีที่ดีกว่าในการใช้พื้นที่หน่วยความจำในสถานการณ์เช่นนี้
หากคุณกำลังใช้ตัวแปรดังกล่าวภายในโครงสร้าง คุณสามารถกำหนดความกว้างของตัวแปรที่บอกคอมไพเลอร์ C ว่าคุณจะใช้เฉพาะจำนวนบิตเหล่านั้น ตัวอย่างเช่น โครงสร้างข้างต้นสามารถเขียนใหม่ได้ดังนี้ −
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status; โครงสร้างด้านบนต้องการพื้นที่หน่วยความจำ 4 บิตสำหรับตัวแปรสถานะ แต่จะเก็บค่าเพียง 2 บิตเท่านั้น
หากคุณจะใช้ตัวแปรสูงสุด 32 ตัวแต่ละตัวที่มีความกว้าง 1 บิต โครงสร้างสถานะจะใช้ 4 บิตด้วย อย่างไรก็ตาม ทันทีที่คุณมี 33 ตัวแปร มันจะจัดสรรสล็อตถัดไปของหน่วยความจำและจะเริ่มใช้ 8 บิต ให้เราตรวจสอบตัวอย่างต่อไปนี้เพื่อทำความเข้าใจแนวคิด -
โค้ดตัวอย่าง
#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;
} ผลลัพธ์
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
การประกาศฟิลด์บิต:
การประกาศบิตฟิลด์มีรูปแบบต่อไปนี้ภายในโครงสร้าง -
struct {
type [member_name] : width ;
}; ตารางต่อไปนี้อธิบายองค์ประกอบตัวแปรของบิตฟิลด์ -
| องค์ประกอบ | คำอธิบาย |
|---|---|
| ประเภท | ประเภทจำนวนเต็มที่กำหนดวิธีตีความค่าของบิตฟิลด์ ประเภทอาจเป็น int, ลงนามใน, หรือ int ที่ไม่ได้ลงนาม |
| ชื่อสมาชิก | ชื่อของบิตฟิลด์ |
| ความกว้าง | จำนวนบิตในฟิลด์บิต ความกว้างต้องน้อยกว่าหรือเท่ากับความกว้างบิตของประเภทที่ระบุ |
ตัวแปรที่กำหนดด้วยความกว้างที่กำหนดไว้ล่วงหน้าเรียกว่าบิตฟิลด์ ฟิลด์บิตสามารถเก็บได้มากกว่าหนึ่งบิต ตัวอย่างเช่น หากคุณต้องการให้ตัวแปรเก็บค่าตั้งแต่ 0 ถึง 7 คุณสามารถกำหนดบิตฟิลด์ที่มีความกว้าง 3 บิตได้ดังนี้ -
struct {
unsigned int age : 3;
} Age; คำจำกัดความโครงสร้างข้างต้นสั่งคอมไพเลอร์ C ว่าตัวแปรอายุจะใช้เพียง 3 บิตในการจัดเก็บค่า หากคุณพยายามใช้มากกว่า 3 บิต คุณจะไม่สามารถทำเช่นนั้นได้ ให้เราลองตัวอย่างต่อไปนี้ –
โค้ดตัวอย่าง
#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;
} ผลลัพธ์
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0