Semua artikel

Operasi bitwise: cara kerja AND, OR, dan XOR di level bit

Sistem izin di Android — akses kamera, lokasi, penyimpanan — pada level manifest sering direpresentasikan sebagai bitmask di lapisan native-nya: setiap izin menempati satu bit dalam sebuah integer, dan mengecek apakah izin tertentu diberikan cukup dengan satu operasi AND terhadap bit yang bersangkutan.

AND, OR, XOR, NOT — empat operasi dasar

  • AND (&) — bit hasil bernilai 1 hanya jika kedua bit masukan bernilai 1. Dipakai untuk memeriksa apakah izin tertentu aktif dalam sebuah mask.
  • OR (|) — bit hasil bernilai 1 jika setidaknya salah satu bit masukan bernilai 1. Dipakai untuk menggabungkan beberapa izin atau flag jadi satu nilai.
  • XOR (^) — bit hasil bernilai 1 jika bit masukan berbeda; menerapkan XOR dua kali dengan nilai yang sama mengembalikan nilai aslinya.
  • NOT (~) — membalik setiap bit sebuah angka.

Bagaimana AND bitwise berbeda dari AND logis

AND logis (&& di sebagian besar bahasa) bekerja dengan nilai boolean secara utuh dan menghasilkan true/false, sedangkan AND bitwise (&) memproses setiap bit dari dua angka secara terpisah dan menghasilkan sebuah angka. Kebingungan antara keduanya adalah sumber bug yang umum, apalagi karena di beberapa bahasa keduanya sama-sama bisa dikompilasi tanpa error tipe data.

Kenapa alat ini berpasangan dengan konverter basis bilangan

Mask izin bernilai 18 dalam desimal tidak menjelaskan apa-apa sekilas pandang, tapi nilai yang sama sebagai 0b10010 langsung menunjukkan bit mana yang aktif. Itu sebabnya operasi bitwise nyaris selalu dinalar dalam biner atau heksadesimal, bukan desimal — konverter basis bilangan biasanya jadi langkah pertama sebelum AND/OR/XOR punya makna visual.

Untuk apa ini dibutuhkan

  • Menyimpan dan memeriksa secara efisien sekumpulan flag boolean dalam satu angka.
  • Memahami kode level rendah yang bekerja dengan protokol jaringan atau format biner.
  • Mengoptimalkan perhitungan di mana operasi bitwise lebih cepat daripada aritmetika biasa.

Jebakan prioritas operator

Di kebanyakan bahasa pemrograman, operator bitwise & dan | memiliki prioritas lebih rendah daripada operator perbandingan — jadi ekspresi seperti if (a & b == c) sebenarnya dievaluasi sebagai a & (b == c), bukan seperti yang biasanya dimaksudkan penulis. Ini salah satu penyebab bug tersembunyi paling umum saat bekerja dengan bitmask, dan cara yang bisa diandalkan untuk menghindarinya adalah selalu membungkus operasi bitwise dalam tanda kurung eksplisit.

Coba alat