Lompat ke konten Lompat ke sidebar Lompat ke footer

Bit Fields Bahasa C Beserta Penjelasannya

Pada Bahasa C dapat ditentukan nilai ukuran dalam satuan bits dari anggota struct dan union. Tujuan dari penggunaan Bit Field pada Bahasa C adalah menggunakan memori dengan efisien ketika diketahui nilai dari sebuah field atau bidang dari kelompok tertentu, ternyata tidak akan pernah melebihi nilai batasan dari ketentuan alokasi memotri, atau hanya menggunakan ruang memori dalam lingkup skala yang lebih kecil.


Sebelum memahami lebih dalam materi tentang Bit Fields Bahasa C Beserta Penjelasannya, terlebih dahulu pelajari materi tentang: Operasi Pada Variabel Struct Bahasa C, Anggota Structure, Padding, dan Data Packing Bahasa C, dan Struct Hack Bahasa C dan Penjelasannya.

Contoh: Perhatikan deklarasi tanggal berikut tanga menggunakan bit field.

#include <stdio.h>


// Contoh sederhana

// representasi dari struct

// tanggal bahasa C.

struct date {

unsigned int d;

unsigned int m;

unsigned int y;

};


int main()

{


printf("Size of date is %lu bytes\n",


sizeof(struct date));


struct date dt = { 31, 12, 2014 };


printf("Date is %d/%d/%d", dt.d, dt.m, dt.y);


return 0;

}

Output:
Size of date is 12 bytes
Date is 31/12/2014


Pada contoh sebelumnya diperlihatkan representasi dari 'date' yang membutuhkan memori 12 bytes pada sebuah kompilator dimana unsigned int akan mengalokasikan memori sebesar 4 bytes, dan karena telah diketahui nilai dari d akan selalu berada pada rentang nilai 01 dan 31, maka nilai dari m adalah 1 hingga 12. Oleh karena itu, maka dapat dilakukan optimisasi ruang memori menggunakan bit field.

Baca Juga:

Jika kode program yang sama dibuat menggunakan signed int dan nilai dari field berada di luar jangkauan alokasi bit ke nilai variabel, maka dapat dilakukan beberapa hal seperti contoh berikut.

Contoh:

#include <stdio.h>


// Ruang optimisasi

// representasi dari struct

// tanggal bahasa C.

struct date {


// d memiliki nilai diantara 0

// dan 31, sehingga nilai 5

// bits adalah memadai.

int d : 5;


// m memiliki nilai diantara 0

// dan 15, sehingga nilai 4

// bits adalah memadai.

int m : 4;


int y;

};


int main()

{


printf("Size of date is %lu bytes\n"

sizeof(struct date));


struct date dt = { 31, 12, 2014 };


printf("Date is %d/%d/%d", dt.d, dt.m, dt.y);


return 0;

}

Output:
Size of date is 8 bytes
Date is -1/-4/2014


Nilai output menjadi nilai negatif. Hal ini karena nilai 31 yang disimpan pada 5 bit signed integer adalah senilai terhadap nilai 11111. Oleh karena itu MSB adalah bernilai 1, atau nilai angka negatif. Oleh karena itu, maka perlu dilakukan kalkulasi 2 komplemen dari angka biner angka aktual yang diselesaikan pada bagian internal memori. Dengan melakukan kalkulasi sebesar 2 komplemen, maka akan didapatkan nilai sebesar 00001, yang senilai dengan angka desimal 1, dan karena angka sebelumnya bernilai negatif maka didapatkan nilai sebesar -1. Hal yang sama juga terjadi pada angka 12, pada kondisi dimana didapatkan 4-bit representasi sebagai nilai 1100, yang kemudian dilakukan kalkulasi sebanyak 2 komplemen sehingga didapatkan nilai sebesar -4.

Beberapa Fakta Tentang Bit Fields pada Bahasa C:
  • Sebuah bit field spesial yang tak bernama dari ukuran 0 digunakan untuk memaksa perataan dari batasan selanjutnya.
  • Bit fields memiliki sebuah pointer ke anggota bit field yang tidak dimulai pada sebuah batasan btye.
  • Bit fields mengimplementasikan definisi ke penandaan diluar dari nilai jangkuan ke sebuah anggota bit field.
  • Pada C++, dapat dimiliki anggota static dalam sebuah class atau struct, tetapi bit fields yang dimilikinya tidak dapat dibuat dalam tipe static.
  • Array dari bit fields tidak diperbolehkan.

Contoh: perhatikan program berikut.

#include <stdio.h>


// Struct tanpa penentuan

// nilai perataan pada 

// Bahasa C.

struct test1 {

unsigned int x : 5;

unsigned int y : 8;

};


// Struct tanpa penentuan

// nilai perataan pada

// Bahasa C.

struct test2 {

unsigned int x : 5;

unsigned int : 0;

unsigned int y : 8;

};


int main()

{

printf("Size of test1 is %lu bytes\n",

sizeof(struct test1));


printf("Size of test2 is %lu bytes\n",

sizeof(struct test2));


return 0;

}

Output:
Size of test1 is 4 bytes
Size of test2 is 8 bytes


Contoh:

#include <stdio.h>


struct test {

unsigned int x : 5;

unsigned int y : 5;

unsigned int z;

};


int main()

{


struct test t;


// Tanpa pemberikan komentar

// akan membuat baris program

// dikompilasi dan dijalankan.

printf("Address of t.x is %p", &t.x);


// Berikut baris kerja program

// yang akan berjalan baik

// sebagai nilai z yang bukan

// merupakan anggota bit

// field.

printf("Address of t.z is %p", &t.z);


return 0;

}

Output:
prog.c: In function 'main':
prog.c:14:1: error: cannot take address of bit-field 'x'
printf("Address of t.x is %p", &t.x);
^


Contoh:

#include <stdio.h>


struct test {

unsigned int x : 2;

unsigned int y : 2;

unsigned int z : 2;

};


int main()

{

struct test t;


t.x = 5;


printf("%d", t.x);


return 0;

}


Implementation-Dependent

Contoh:

// Contoh program C++ ketika

// dikompilasi dan dijalankan

// pada komputer.

struct test1 

{

static unsigned int x;

};


int main() {}


Contoh:

// Namun, pada program C++

// berikut, proses kompilasi

// akan mengalami kegagalan,

// karena nilai bit fields

// tidak bisa dalam bentuk

// static.

struct test1 

{

static unsigned int x : 5;

};


int main() {}

Output:
prog.cpp:5:29: error: static member 'x' cannot be a bit-field
static unsigned int x : 5;


Contoh: Program berikut akan gagal jika dilakukan kompilasi program.

struct test 

{

unsigned int x[10] : 5;

};


int main(){}

Output:
prog.c:3:1: error: bit-field 'x' has invalid type
unsigned int x[10]: 5;
^


Jika kapasitas penyimpanan suatu komputer terbatas, maka dapat digunakan bit-field ketika membuat program untuk efisiensi kapasitas memori pada komputer. Ketika perangkat mengirimkan transmisi status atau informasi encoded ke bit ganda untuk tipe dari situasi bit-field, maka hal tersebut akan membuat komputer dapat bekerja menjadi lebih efisien.


Artikel ini didedikasikan kepada: Diska Choirunnisa, Dwi Setyawan, Erlinda Suastika Dewi, Faizal Rifqi Pujaka, dan Fanny Raka Satria.

6 komentar untuk "Bit Fields Bahasa C Beserta Penjelasannya"

  1. Apa yang dimaksud dengan Bit Fields pada Bahasa C?

    BalasHapus
    Balasan
    1. Pada C++ dimungkinkan untuk melakukan proses penyimpanan tipe dat ainteger ke dalam ruang memori yang lebih kecil dari ukuran biasanya menggunakan kompilator. Anggota struct yang lebih hemar ruang tersebut disebut dengan bit fields, dimana ukuran lebar dari ruang penyimpanan tersebut disimpan dalam satua bit yang dideklarasikan secara eksplisit.

      Hapus
  2. Kenapa harus menggunakan bit fields pada Bahasa C?

    BalasHapus
    Balasan
    1. Karena penggunaan Bit field pada bahasa C membuat ruang penyimpanan menjadi lebih efisien atau lebih hemat.

      Hapus
  3. Kapan Bit Field pada Bahasa C digunakan?

    BalasHapus
    Balasan
    1. Bit Fields pada Bahasa C digunakan ketika ruang penyimpanan program terbatas atau ukurannya kecil.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -