Bit masking hanyalah proses menyimpan data benar-benar sebagai bit, bukan sebagai char/int/float. Ini sangat berguna untuk menyimpan jenis data tertentu secara ringkas dan efisien.
Idenya untuk bit masking didasarkan pada logika boolean. Bagi yang belum familiar, logika boolean adalah manipulasi 'benar' (1) dan 'salah' (0) melalui operasi logika (yang mengambil 0 dan 1 sebagai argumen mereka). Kita tertarik dengan operasi berikut:
Dalam komputasi, salah satu dari nilai true/false ini adalah bit. Primitif dalam C (int, float, dll) terdiri dari sejumlah bit tertentu, di mana jumlahnya merupakan kelipatan 8. Sebagai contoh, int mungkin setidaknya 16 bit, sedangkan char mungkin 8 bit. 8 bit biasanya disebut sebagai byte. C menjamin bahwa primitif tertentu adalah setidaknya beberapa jumlah byte. Perkenalan stdint.h dalam C11 memungkinkan programmer untuk menentukan tipe integer yang persis beberapa jumlah byte, yang sangat berguna ketika menggunakan masker.
Bit mask sering digunakan ketika mengatur flag. Flag adalah nilai-nilai yang bisa berada dalam dua keadaan, seperti 'aktif/nonaktif' dan 'bergerak/diam'.
Mengatur bit n adalah se-sederhana ORing nilai variabel penyimpanan dengan nilai 2^n.
storage |= 1 << n;
Sebagai contoh, berikut adalah pengaturan bit 3 di mana storage adalah char (8 bit):
01000010
OR 00001000
==
01001010
Logika 2^n menempatkan nilai '1' pada bit yang tepat dalam masker itu sendiri, memungkinkan akses ke bit yang sama dalam variabel penyimpanan.
Menghapus bit n adalah hasil dari ANDing nilai variabel penyimpanan dengan kebalikan (NOT) dari nilai 2^n:
storage &= ~(1 << n);
Berikut adalah contoh lagi:
01001010
AND 11110111
==
01000010
Membalikkan bit n adalah hasil dari XORing nilai variabel penyimpanan dengan 2^n:
storage ^= 1 << n;
01000010 01001010
XOR XOR
00001000 00001000
== ==
01001010 01000010
Memeriksa bit adalah ANDing nilai 2^n dengan penyimpanan bit:
bit = storage & (1 << n);
01000010 01001010
AND AND
00001000 00001000
== ==
00000000 00001000
| Operator | Nama | Deskripsi | Contoh |
|---|---|---|---|
| & | AND | Mengembalikan 1 jika kedua bit adalah 1 | 5 & 3 = 1 |
| | | OR | Mengembalikan 1 jika salah satu bit adalah 1 | 5 \| 3 = 7 |
| ^ | XOR | Mengembalikan 1 jika bit berbeda | 5 ^ 3 = 6 |
| ~ | NOT | Membalikkan semua bit | ~5 = ...1010 |
| << | Left Shift | Menggeser bit ke kiri | 5 << 1 = 10 |
| >> | Right Shift | Menggeser bit ke kanan | 5 >> 1 = 2 |
Gunakan bit mask untuk memanipulasi beberapa flag.
Requirements:
- Gunakan operasi bitwise untuk mengatur, menghapus, dan memeriksa flag
- Gunakan operator OR (|) untuk mengatur flag
- Gunakan operator AND (&) untuk memeriksa flag
- Gunakan operator NOT (~) untuk menghapus flag
Expected Output:
Done!
Try writing your solution in the code editor below!
Current Lesson: Bitmasks
Learning Objectives:
- Memahami konsep bitmask dalam bahasa C
- Belajar melakukan operasi bitwise pada bit
- Mengenal operasi NOT, AND, OR, XOR pada bit
- Memahami penggunaan bitmask dalam menyimpan flag
Prerequisites:
- Pemahaman tentang sistem bilangan biner
- Pemahaman dasar tentang operator logika