ในส่วนนี้เราจะพูดถึง 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