Bitwise JavaScript
Dalam pemrograman komputer, operasi bitwise beroperasi pada angka biner untuk mengevaluasi ekspresi.
JavaScript menyimpan angka yang biasa kita gunakan sebagai angka floating-point 64-bit, namun ketika melakukan operasi bitwise itu akan diubah menjadi bilangan biner 32-bit.
Itu berarti, sebelum operasi bitwise dilakukan, JavaScript akan mengonversi angka apa pun menjadi bilangan bulat signed 32-bit dan kemudian dikonversi kembali menjadi 64-bit setelah operasi selesai.
Operator Bitwise JavaScript
Ada beberapa operator bitwise yang tersedia di JavaScript, yaitu:
| Operator | Nama | Keterangan |
|---|---|---|
& | AND | mengembalikan 1 jika keduanya 1 |
| | OR | mengembalikan 1 jika salah satu atau keduanya 1 |
^ | XOR | mengembalikan 1 jika hanya satu yang bernilai 1 |
~ | NOT | balikkan 0 jadi 1, 1 jadi 0 |
<< | left shift | tambah 0 ke kanan dan buang yang berlebih dari kiri |
>> | right shift | tambah dari kiri dan buang yang berlebih dari kanan (sign-propagating) |
>>> | unsigned right shift | tambah 0 ke kiri dan buang yang berlebih dari kanan (zero-fill right shift) |
Operator AND (&)
Operator AND & mengembalikan 1 jika keduanya adalah 1.
Sintaks
a & b
Contoh
const a = 9; // 00000000000000000000000000001001 (biner dari 9)
const b = 7; // 00000000000000000000000000000111 (biner dari 7)
a & b; // 00000000000000000000000000000001 (dikonversi ke desimal menjadi 1 (output))
Operator AND membandingkan bit pertama dari kanan secara berurutan sampai akhir bit paling kiri.
Contoh di atas, bit paling kanan variabel a adalah 1 dan b adalah 1, nilai inilah yang dibandingkan secara berurutan dari kanan ke kiri.
Operator AND hanya akan mengembalikan 1 jika kedua bit yang dibanding sama-sama 1. Oleh karena bit pertama dari hasil a & b adalah 1, sedangkan bit kedua dan seterusnya adalah 0.
Operator OR (|)
Operator OR | mengembalikan 1 jika salah satu atau keduanya adalah 1.
Sintaks
a | b
Contoh
const a = 9; // 00000000000000000000000000001001 (biner dari 9)
const b = 7; // 00000000000000000000000000000111 (biner dari 7)
a | b; // 00000000000000000000000000001111 (dikonversi ke desimal menjadi 15 (output))
Mirip dengan operator sebelumnya, bit pertama paling kanan dari variabel a dibandingkan dengan dengan bit pertama paling kanan dari variabel b, berurutan sampai bit paling kiri.
Jika salah satu atau kedua bit yang dibandingkan adalah 1 maka hasilnya adalah 1, oleh karena itu 4 digit pertama (dari kanan) hasil dari a | b adalah 1111.
Operator XOR (^)
Operator XOR ^ mengembalikan 1 jika hanya ada satu yang bernilai 1.
Sintaks
a ^ b
Contoh
const a = 9; // 00000000000000000000000000001001 (biner dari 9)
const b = 7; // 00000000000000000000000000000111 (biner dari 7)
a ^ b; // 00000000000000000000000000001110 (dikonversi ke desimal menjadi 14 (output))
Sama seperti operator sebelumnya, angka biner paling kanan setiap variabel dibandingkan secara berurutan sampai angka biner paling kiri.
Perbedaannya, operator ^ hanya akan menghasilkan 1 jika hanya ada satu yang bernilai 1, oleh karena itu pada contoh di atas, bit pertama dari kanan hasil a ^ b adalah 0, dan bit ke 2 - 4 adalah 1.
Operator Not (~)
Operator NOT (~) hanya membutuhkan satu operan (unary), operator ini membalikkan angka biner dari 1 ke 0 atau dari 0 ke 1.
Sintaks
~a
Contoh
const x = 12; // 00000000000000000000000000001100 (biner dari 12)
~x; // 11111111111111111111111111110011 (dikonversi ke desimal menjadi -13 (output))
Perhatikan bahwa digit pertama (paling kanan) dari biner 12 adalah 0, karena operator ini membalikkan maka yang dikembalikan adalah 1, bit ketiga yaitu 1 diubah menjadi 0.
Jika biner yang dihasilkan dari ekspresi ~12 yaitu 11111111111111111111111111110011 dikonversi ke desimal hasilnya adalah 4294967283, tetapi ketika menggunakan operator bitwise nilainya dihitung dalam format komplemen 2.
Operator Left Shift (<<)
Operator Left Shift mendorong 0 dari kanan ke kiri ke angka biner operan kiri sebanyak operan kanan, angka biner yang berlebih dibuang dari kiri.
Sintaks
a << b
Contoh
const a = 9; // 00000000000000000000000000001001 (biner dari 9)
const b = 2;
a << b; // 00000000000000000000000000100100 (dikonversi ke desimal menjadi 36 (output))
Contoh diatas kita mendorong 0 ke kanan biner dari variabel a sebanyak variabel b yaitu 2, setelah itu buang biner dari kiri sebanyak variabel b.
Operator Right Shift (>>)
Operator Right Shift >> mendorong bit dari operan pertama dari kiri ke kanan sebanyak operan kanan.
Sintaks
x >> b;
Contoh
// contoh pertama
const a = 8; // 00000000000000000000000000001000 (biner dari 8)
const b = 3;
8 >> 3; // 00000000000000000000000000000001 (dikonversi ke desimal menjadi 1 (output))
// contoh kedua
const c = -9; // 11111111111111111111111111110111 (biner dari -9)
const d = 4;
-9 >> 4; // 11111111111111111111111111111111 (dikonversi ke desimal menjadi -1 (output))
Contoh pertama, biner dari variabel a didorong ke kanan sebanyak variabel b (3), kemudian biner paling kiri diduplikasi sebanyak variabel b, begitu juga contoh kedua.
Operator Unsigned Right Shift (>>>)
Operator Unsigned Right Shift (>>>) mendorong 0 ke biner dari operan kiri dari kiri ke kanan sebanyak operan kanan. Operator ini selalu mengembalikan bilangan positif.
Sintaks
a >>> b
Sintaks
// contoh pertama
const a = 8; // 00000000000000000000000000001000 (biner dari 8)
const b = 3;
8 >>> 3; // 00000000000000000000000000000001 (dikonversi ke desimal menjadi 1 (output))
// contoh kedua
const c = -9; // 11111111111111111111111111110111 (biner dari -9)
const d = 4;
-9 >>> 4; // 00001111111111111111111111111111 (dikonversi ke desimal menjadi 268435455 (output))
Contoh pertama, biner dari variabel a didorong dari kiri ke kanan sebanyak variabel b (3), kemudian tambahkan 0 ke kiri sebanyak variabel b (3), buang biner paling kanan agar cukup 32-bit, begitu juga contoh kedua.