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.