Khai báo Bit Field

Bit Field là cách biểu diễn các thành phần dữ liệu của struct một cách tối ưu. Cách biểu diễn Bit Field giúp tối ưu bộ nhớ. Để thấy rõ tác dụng của Bit Field ta đi xét ví dụ sau:

Ví dụ 1: Khai báo struct để lưu thông tin ngày, tháng, năm.

struct st_day
{
    unsigned int date; //ngay
    unsigned int month; //thang
    unsigned int year; //nam
};

Ta thấy trường date có giá trị từ 1 -> 31, trường month có giá trị từ 1 -> 12, trường year(0 -> 4000). Nếu ta dùng kiểu usigned int (kích thước 4 byte) để biểu diễn giá trị của các trường date, month, year thì gây lãng phí bộ nhớ. Ngôn ngữ C còn cung cấp cho ta một phương pháp biểu diễn struct giúp tối ưu bộ nhớ, được gọi là Bit Field.

Khai báo Bit Field

struct
{
<kieu_du_lieu><ten_bien_1> : n1;
<kieu_du_lieu><ten_bien_2> : n2;
...
<kieu_du_lieu><ten_bien_k> : nk;
};

<kieu_du_lieu> : là kiểu dữ liệu số nguyên (int, signed int, unsigned int,..)

<ten_bien_1>, <ten_bien_2>, … <ten_bien_k>: gọi các biến bit field.

n1, n2, n3, …, nk : độ rộng (bit) của các biến bit field, nk phải nhỏ hơn hoặc bằng số bit của kiểu dữ liệu.

Ví dụ 2: Biểu diễn thông tin ngày, tháng, năm bằng Bit Field

struct bf_day
{
    unsigned int date : 5;  //1->31
    unsigned int month : 4;  //1->12
    unsigned int year : 12;    //0->4000
};

Trường date có giá trị từ 1 -> 31. Do vậy, bạn chỉ cần dùng 5 bit (2^5 – 1 = 31) để biểu diễn trường date
Trường month có giá trị từ 1 -> 12. Do vậy, bạn chỉ cần dùng 4 bit (2^4 – 1 = 15) để biểu diễn trường month
Trường year có giá trị từ 0 -> 4000. Do vậy, bạn chỉ cần dùng 12 bit(2^12 – 1 = 4095) để biểu diễn trường year.

Ví dụ 3: So sánh kích thước của việc khai báo struct bằng Bit Field và việc khai báo không dùng Bit Field.

#include "stdio.h"
#include "conio.h"

struct st_day
{
    unsigned int date; //ngay
    unsigned int month; //thang
    unsigned int year; //nam
};
struct bf_day
{
    unsigned int date : 5;  //1->31
    unsigned int month : 4;  //1->12
    unsigned int year : 12;    //0->4000
};

void main()
{
    st_day x;
    bf_day y;
    printf("\nSize of no bit field struct: %d",sizeof(x));
    printf("\nSize of bit field struct: %d", sizeof(y));
    getch();
}

Kết quả:

Size of no bit field struct: 12

Size of bit field struct: 4

Ta thấy, việc khai báo struct sử dụng Bit field sẽ tối ưu được khá nhiều bộ nhớ.

Be the first to comment

Leave a Reply