"Hai, Amigo!"

"Saya juga ingin berbicara tentang bitmask dan XOR."

"Anda sudah tahu bahwa angka terdiri dari bit dan Anda dapat melakukan berbagai operasi pada bit ini. Sebuah bitmask adalah representasi dari beberapa nilai logis yang berbeda (nilai benar/salah) sebagai satu bilangan bulat. Dalam hal ini, setiap nilai boolean sesuai dengan sedikit spesifik. Begini caranya:"

"Representasi biner dari kekuatan dua (1, 2, 4, 8, 16, 32, ...) hanya melibatkan pengaturan satu bit:"

Nomor Representasi biner
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (bukan pangkat dua) 0001 0011
31 (bukan pangkat dua) 0001 1111

"Jadi, bilangan bulat apa pun dapat diperlakukan sebagai larik bit atau larik nilai boolean."

"Inilah cara Anda menyimpan nilai boolean yang berbeda dalam satu angka:"

Nilai Boolean
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
Nilai dikemas ke dalam satu nomor:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

"Sekarang setiap bit adalah 1 jika variabel boolean yang sesuai benar."

Dalam kasus kita, variabel a dan c benar, jadi hasilnya sama dengan 1+4 == 5

0000 0101
0000 dcba

"Kurasa aku tahu apa yang terjadi."

"Yah, jika kamu mengerti, mari kita lanjutkan."

"Int memiliki 32 bit. Salah satunya digunakan untuk tanda angka, dan 31 lainnya dapat digunakan untuk menyimpan nilai dari 31 variabel boolean."

"Sebuah panjang memiliki 64 bit di mana kita dapat menyimpan 63 variabel boolean."

"Ya."

"Lusinan variabel dijejalkan ke dalam satu angka. Cukup banyak."

"Tapi di mana ini diterapkan?"

"Terutama dalam situasi di mana Anda perlu menyimpan banyak informasi tentang objek. Saat Anda menyimpan banyak informasi tentang suatu objek, selalu ada beberapa lusin variabel boolean. "Dengan pendekatan ini, semuanya disimpan dengan mudah dalam satu nomor ."

"Dengan penekanan pada kata 'disimpan'. Karena sebenarnya menggunakan angka itu tidak begitu nyaman."

"Ngomong-ngomong, itu yang ingin saya tanyakan. Bagaimana kita mengekstrak nilai boolean dari angka tersebut?"

"Sama sekali tidak rumit. Katakanlah Anda perlu menentukan apakah bit 6 disetel ke 1 (2 pangkat lima adalah 32). Kita bisa memeriksanya seperti ini:"

Gabungkan angka menjadi satu:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
Ekstrak nilai dengan memeriksa bit tertentu:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

"Dengan demikian, bekerja dengan bitmask melibatkan tiga operasi:"

1)  Tetapkan bit tertentu ke 0

2)  Tetapkan bit tertentu ke 1

3)  Periksa nilai bit tertentu.

"Ambil bit 6, misalnya."

"Bagaimana Anda mengatur bit 6 ke 1?"

Kode Keterangan
result = result | 01000000;
result |= 01000000;
Bagaimana Anda mengatur bit 6 ke 1?
result = result & 10111111;
result &= 10111111;
Bagaimana Anda mengatur bit 6 ke 0?
c = result & 01000000;
Bagaimana Anda mendapatkan nilai bit 6?

"Itu sangat tidak biasa, tapi tidak sulit. Sobat, sekarang saya adalah programmer handal."

"Dan satu lagi tip kecil tentang cara mudah mendapatkan angka dengan bit tertentu yang disetel ke 0 atau 1: 01000000 atau 10111111."

Untuk ini, kami memiliki  operator >> dan  << .

"1 adalah 2 pangkat nol. Dengan kata lain, angka dengan bit 0 disetel ke 1. Kita membutuhkan angka dengan bit 6 yang disetel."

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

"Keren! Itu sangat membantu untuk kasus seperti itu."

"Tetapi bagaimana jika saya memerlukan nomor di mana setiap bit disetel ke 1 kecuali satu bit tertentu disetel ke 0?"

"Itu juga tidak sulit:"

int d = ~(1 << 6); // ~0100 0000 == 10111111

"Dengan kata lain, semuanya sangat sederhana:"

Kode Keterangan
result = result | (1 << 6);
result |= (1 << 6);
Bagaimana Anda mengatur bit 6 ke 1?
result = result & ~(1 << 6);
result &= ~(1 << 6);
Bagaimana Anda mengatur bit 6 ke 0?
c = result & (1 << 6);
Bagaimana Anda mendapatkan nilai bit 6?

"Kelihatannya tidak terlalu sulit. Tapi aku tidak akan langsung mengingatnya."

"Tetapi, jika Anda menemukan ekspresi menakutkan seperti" hasil &= ~(1 << 6)" dalam kode orang lain, Anda akan tahu bahwa seseorang ini hanya bekerja dengan bitmask."

"Dan jika kamu sering menjumpainya, maka dia akan mengingat dirinya sendiri untukmu."

"Ingat sendiri... Kedengarannya bagus. Terima kasih atas pelajarannya."