Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

บิตฟิลด์ในC


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