Karena tidak ada yang menyinggung masalah mengapa ini berguna:
Saya sering menggunakan operasi bitwise saat bekerja dengan flag. Misalnya, jika Anda ingin meneruskan serangkaian flag ke operasi (misalnya File.Open()
,, dengan mode Baca dan mode Tulis keduanya diaktifkan), Anda bisa meneruskannya sebagai nilai tunggal. Ini dilakukan dengan menetapkan setiap flag yang mungkin, bit itu sendiri dalam bitset (byte, pendek, int, atau panjang). Sebagai contoh:
Read: 00000001
Write: 00000010
Jadi jika Anda ingin lulus baca DAN menulis, Anda akan lulus (BACA | MENULIS) yang kemudian menggabungkan keduanya menjadi
00000011
Yang kemudian dapat didekripsi di ujung yang lain seperti:
if ((flag & Read) != 0) { //...
yang memeriksa
00000011 &
00000001
yang kembali
00000001
yang bukan 0, sehingga flag tidak menentukan BACA.
Anda dapat menggunakan XOR untuk mengaktifkan berbagai bit. Saya telah menggunakan ini ketika menggunakan flag untuk menentukan input directional (Atas, Bawah, Kiri, Kanan). Sebagai contoh, jika sebuah sprite bergerak secara horizontal, dan saya ingin itu berbalik:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Saya cukup XOR nilai saat ini dengan (KIRI | KANAN) yang akan mematikan KIRI dan KANAN, dalam hal ini.
Bit Shifting berguna dalam beberapa kasus.
x << y
sama dengan
x * 2 y
jika Anda perlu dengan cepat mengalikan dengan kekuatan dua, tapi hati-hati untuk menggeser 1-bit ke bit atas - ini membuat angka negatif kecuali itu tidak ditandatangani. Ini juga berguna ketika berhadapan dengan berbagai ukuran data. Misalnya, membaca bilangan bulat dari empat byte:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Dengan asumsi bahwa A adalah byte yang paling signifikan dan D yang paling sedikit. Itu akan berakhir sebagai:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Warna sering disimpan dengan cara ini (dengan byte paling signifikan diabaikan atau digunakan sebagai Alpha):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Untuk menemukan nilai-nilai lagi, cukup geser bit ke kanan sampai di bagian bawah, lalu sembunyikan bit urutan lebih tinggi yang tersisa:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
sama dengan 11111111
. Jadi pada dasarnya, untuk Red, Anda akan melakukan ini:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)