Kadang data diolah sampai ke tingkat bit, bukan sekadar angka utuh. Kombinasi opsi (flag), format penyimpanan ringkas, dan protokol jaringan semuanya menggabungkan bit secara langsung. Operator bitwise melayani kebutuhan itu: operator mengoperasikan setiap bit dari bilangan integer satu per satu.

Empat Operator Bitwise #

OperatorNamaAturan per bit
&Bitwise AND1 hanya bila kedua bit bernilai 1
|Bitwise OR1 bila salah satu bit bernilai 1
^Bitwise XOR1 hanya bila kedua bit berbeda
~Bitwise NOTMembalik setiap bit: 1 menjadi 0, 0 menjadi 1

Membaca Pola Biner #

Hasil bitwise sulit dibaca dalam bentuk desimal, sehingga kita memakai Convert.ToString(nilai, 2) untuk menampilkan bilangan sebagai string biner. Method PadLeft(8, '0') menambah angka nol di depan agar setiap pola berukuran sama, delapan digit.

csharp
int a = 12;   // biner 1100
int b = 10;   // biner 1010

Console.WriteLine($"a      = {Convert.ToString(a, 2).PadLeft(8, '0')}");
Console.WriteLine($"b      = {Convert.ToString(b, 2).PadLeft(8, '0')}");
Console.WriteLine($"a & b  = {Convert.ToString(a & b, 2).PadLeft(8, '0')}  -> {a & b}");
Console.WriteLine($"a | b  = {Convert.ToString(a | b, 2).PadLeft(8, '0')}  -> {a | b}");
Console.WriteLine($"a ^ b  = {Convert.ToString(a ^ b, 2).PadLeft(8, '0')}  -> {a ^ b}");
Console.WriteLine($"~a     = {~a}");

int opsiBaca = 0b0000_0101;
Console.WriteLine(opsiBaca & 0b0000_0100);
Console.WriteLine(Convert.ToString(opsiBaca | 0b0000_0010, 2).PadLeft(8, '0'));
Console.WriteLine(opsiBaca | 0b0000_0010);

Output yang Dihasilkan:

text
a      = 00001100
b      = 00001010
a & b  = 00001000  -> 8
a | b  = 00001110  -> 14
a ^ b  = 00000110  -> 6
~a     = -13
4
00000111
7

Mari kita telaah baris demi baris:

  1. Baris 1-2 (a, b): Variabel a menyimpan 12 (00001100 dalam biner) dan b menyimpan 10 (00001010).
  2. a & b: Kedua pola dibandingkan bit demi bit; hanya bit keempat dari kanan yang sama-sama 1, sehingga hasilnya 00001000 atau desimal 8.
  3. a | b: Setiap posisi yang memuat minimal satu 1 menjadi 1; hasilnya 00001110 atau desimal 14.
  4. a ^ b: Setiap posisi dengan bit berbeda menjadi 1; hasilnya 00000110 atau desimal 6.
  5. ~a: Semua 32 bit milik a dibalik; hasilnya desimal -13.
  6. opsiBaca & 0b0000_0100: Variabel opsiBaca berisi 00000101; operasi & menghasilkan 4 (bukan nol), artinya bit ketiga menyala.
  7. opsiBaca | 0b0000_0010: Operasi | menyalakan bit kedua tanpa mengubah bit lain; pola menjadi 00000111 atau desimal 7.

Pola Umum: Flag Opsi #

Bitwise sering dipakai untuk menata flag: setiap bit pada satu integer mewakili satu opsi yang menyala atau mati. Nilai hakAkses = 0b0000_0101 berarti opsi pada bit pertama dan bit ketiga aktif. Expression hakAkses & 0b0000_0100 menghasilkan bukan-nol ketika bit ketiga menyala, sehingga pengecekan satu opsi cukup dengan satu operasi &. Operator | berperan sebaliknya: menggabungkan beberapa opsi menjadi satu nilai, misalnya opsiA | opsiB.