Kodealgo

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:

OperatorNamaKeterangan
&ANDmengembalikan 1 jika keduanya 1
|ORmengembalikan 1 jika salah satu atau keduanya 1
^XORmengembalikan 1 jika hanya satu yang bernilai 1
~NOTbalikkan 0 jadi 1, 1 jadi 0
<<left shifttambah 0 ke kanan dan buang yang berlebih dari kiri
>>right shifttambah dari kiri dan buang yang berlebih dari kanan (sign-propagating)
>>>unsigned right shifttambah 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.