Operator bit ECMAScript

Operator bit adalah operasi yang dilakukan di tingkatan dasar nombor (iaitu 32 digit yang mewakili nombor)

Kembali ke nombor bulat

ECMAScript hanya mempunyai dua jenis nombor bulat, iaitu nombor bulat bersempada berhubung (memungkinkan nombor positif dan negatif) dan nombor bulat tak bersempada berhubung (hanya memungkinkan nombor positif). Dalam ECMAScript, semua bilangan bulat yang dinyatakan secara langsung adalah nombor bulat bersempada berhubung, macam ini artinya?

Nombor bulat bersempada berhubung menggunakan 31 bit untuk mewakili nilai nombor, dan digit ke-32 untuk mewakili simbol nombor, 0 untuk nombor positif dan 1 untuk nombor negatif. Rentang nilai adalah dari -2147483648 hingga 2147483647.

Ada dua cara untuk menyimpan nombor bulat bersempada berhubung dalam bentuk binari, satu untuk nombor positif dan satu untuk nombor negatif. Nombor positif disimpan dalam bentuk binari sebenar, setiap digit di 31 bit mewakili kuasa 2, bermula dari digit ke-1 (digit 0) yang mewakili 20Digit kedua (digit 1) menunjukkan 21Digit yang tidak digunakan diisi dengan 0, iaitu diabaikan. Sebagai contoh, gambar di bawah ini menunjukkan wujud bagi nombor 18.

Bilangan bulat berbiner 32 bit yang diwakili

Versi binari bagi 18 hanya menggunakan 5 digit pertama, dan ini adalah digit yang sah bagi nombor ini. Jika mengubah nombor ini ke string binari, dapat lihat digit yang sah:

var iNum = 18;
alert(iNum.toString(2));	// mengeluarkan "10010"

Ini kod hanya mengeluarkan "10010", bukannya wujud 32 bit bagi 18. Nombor lain tidak penting kerana hanya 5 digit pertama yang digunakan untuk menentukan nilai desimal ini. Sebagai contoh di bawah ini:

Bilangan bulat berbiner 5 bit yang diwakili 18

Bilangan negatif juga disimpan dalam bentuk kode biner, tetapi dalam bentuk complement biner. Langkah tiga untuk menghitung complement biner angka adalah:

  1. Tentukan representasi biner versi non-negatif angka (misalnya, untuk menghitung complement biner -18, pertama-tama tentukan representasi biner 18)
  2. Dapatkan kode invers biner, yaitu mengganti 0 dengan 1 dan mengganti 1 dengan 0
  3. Tambahkan 1 ke kode invers biner

Untuk menentukan representasi biner -18, pertama-tama harus mendapatkan representasi biner 18, seperti yang berikut:

0000 0000 0000 0000 0000 0000 0001 0010

Berikutnya, hitung kode invers biner, seperti yang berikut:

1111 1111 1111 1111 1111 1111 1110 1101

Akhirnya, tambahkan 1 ke kode invers biner, seperti yang berikut:

1111 1111 1111 1111 1111 1111 1110 1101
                                      1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110

Jadi, representasi biner -18 adalah 1111 1111 1111 1111 1111 1111 1110 1110. Ingat, saat mengelola integer berdertak, para pengembang tidak dapat mengakses bit 31.

Menariknya, saat bilangan negatif diubah ke string biner, ECMAScript tidak menampilkan dalam bentuk complement biner, tetapi menampilkan dengan menambahkan tanda negatif di depan kode biner nilai absolut. Contohnya:

var iNum = -18;
alert(iNum.toString(2));	//keluarkan "-10010"

Kode ini mengeluarkan "-10010", bukan kode biner complement, untuk menghindari akses bit 31. Untuk keperluan keudahan, ECMAScript mengelola integer dengan cara yang sederhana, sehingga para pengembang tidak perlu khawatir tentang penggunaannya.

Dari sisi lain, integer tak berdertak menganggap bit terakhir sebagai bit lain. Dalam modus ini, bit ke-32 tidak mewakili simbol angka, tetapi nilai 2.31Disebabkan bit ekstra ini, rentang nilai integer tak berdertak adalah 0 hingga 4294967295. Untuk integer yang kurang dari 2147483647, integer tak berdertak kelihatan sama seperti integer berdertak, sedangkan integer yang lebih besar dari 2147483647 harus menggunakan bit 31 (dalam integer berdertak, bit ini selalu 0).

Konversi integer tak berdertak ke string hanya mengembalikan bit yang efektif.

Perhatian:Semua ekuivalen angka integer secara default disimpan sebagai integer berdertak. Hanya operator bit ECMAScript yang dapat menciptakan integer tak berdertak.

Operasi bit NOT

Operasi bit NOT digambarkan dengan simbol negatif (~), ia adalah salah satu dari sedikit operator aritmetika biner yang ada dalam ECMAScript.

Operasi bit NOT adalah proses tiga tahap:

  1. Pindahkan operand ke nombor 32-bit
  2. Pindahkan nombor binari ke kod binari yang terbalik
  3. Pindahkan nombor binari ke nombor floating-point

Contohnya:

var iNum1 = 25;		// 25 setara dengan 00000000000000000000000000011001
var iNum2 = ~iNum1;	// Dialihkan ke 11111111111111111111111111100110
alert(iNum2);		// keluaran "-26"

Operasi bit NOT sebenarnya adalah mengambil negatif nombor, kemudian mengurangkan 1, jadi 25 menjadi -26. Cara lain untuk mendapatkan hasil yang sama adalah:

var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2);	// keluaran -26

Operasi bit AND

Operasi bit AND ditandakan dengan tanda plus (ampersand) (&), langsung melakukan operasi terhadap bentuk binari nombor. Ia mengatur setiap digit dalam nombor, kemudian melakukan operasi AND terhadap digit yang sama di posisi yang sama menurut aturan berikut:

Digit angka pertama Digit angka kedua Hasil
1 1 1
1 0 0
0 1 0
0 0 0

Contohnya, untuk melakukan operasi AND terhadap nombor 25 dan 3, kod seperti berikut:

var iResult = 25 & 3;
alert(iResult);	// keluaran "1"

Hasil AND antara 25 dan 3 adalah 1. Mengapa? Analisis seperti berikut:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001

Bisa dilihat, di antara 25 dan 3, hanya satu digit (digit 0) yang menempatkan 1, jadi, digit lainnya yang dihasilkan adalah 0, jadi hasilnya adalah 1.

Operasi bit OR

Operasi bit OR ditandakan dengan simbol (|), dan langsung melakukan operasi terhadap bentuk binari nombor. Dalam menghitung setiap digit, operator OR menggunakan aturan berikut:

Digit angka pertama Digit angka kedua Hasil
1 1 1
1 0 1
0 1 1
0 0 0

Kembali kepada contoh penggunaan operator AND, lakukan OR antara 25 dan 3, kod seperti berikut:

var iResult = 25 | 3;
alert(iResult);	// keluaran "27"

Hasil OR antara 25 dan 3 adalah 27:

25 = 0000 0000 0000 0000 0000 0000 0001 1001
 3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011

Bisa dilihat, di antara dua nombor, ada 4 digit yang menempatkan 1, digit ini disampaikan ke hasil. Kod binari 11011 setara dengan 27.

Operasi bit XOR

Operasi bit XOR ditandai dengan simbol (^), tentu saja, dilakukan langsung terhadap bentuk biner. XOR berbeda dengan OR, saat hanya ada satu digit yang menyimpan angka 1, ia akan mengembalikan 1. Tabel kebenaran seperti berikut:

Digit angka pertama Digit angka kedua Hasil
1 1 0
1 0 1
0 1 1
0 0 0

Operasi XOR bit dilakukan antara 25 dan 3, kode seperti berikut:

var iResult = 25 ^ 3;
alert(iResult);	//menampilkan "26"

Hasil operasi XOR antara 25 dan 3 adalah 26:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010

Dapat dilihat, di antara 2 angka, ada 4 digit yang menyimpan angka 1, yang disampaikan ke hasil. Kode biner 11010 sama dengan 26.

Operasi arah kiri

Operasi arah kiri ditandai dengan dua tanda < (<<). Ia akan gerakkan semua digit angka ke arah kiri sejumlah yang ditentukan. Contohnya, jika angka 2 (sama dengan biner 10) digerakkan 5 digit ke kiri, hasilnya adalah 64 (sama dengan biner 1000000):

var iOld = 2;		//sama dengan biner 10
var iNew = iOld << 5;	//sama dengan biner 1000000 desimal 64

Perhatian:Saat menggerakkan digit ke kiri, digit di sisi kanan bilangan akan ada 5 digit kosong. Operasi arah kiri mengisi ruang kosong ini dengan 0, sehingga hasilnya menjadi bilangan 32-bit yang lengkap.

Arah kiri operasi bilangan 2

Perhatian:Operasi arah kiri mempertahankan digit simbol angka. Contohnya, jika -2 digerakkan 5 digit ke kiri, hasilnya adalah -64, bukan 64. "Simbol masih disimpan di digit ke-32?" Ya, tapi ini dilakukan di belakang ECMAScript, para pengembang tidak dapat mengakses digit ke-32 secara langsung. Meskipun menampilkan bilangan negatif dalam bentuk string biner, yang ditampilkan adalah bentuk simbol negatif (contoh, -2 akan ditampilkan -10.)

Operator arah kanan

Operator arah kanan dengan tanda (+) ditandai dengan dua tanda > (>>). Ia akan gerakkan semua digit angka 32-bit secara keseluruhan ke arah kanan, sambil mempertahankan simbol angka (positif atau negatif). Operator arah kanan sama dengan arah kiri sebaliknya. Contohnya, jika 64 digerakkan 5 digit ke kanan, akan menjadi 2:

var iOld = 64; // sama dengan biner 1000000
var iNew = iOld >> 5; // sama dengan biner 10 desimal 2

Juga, operasi geser bit akan menyebabkan ruang kosong. kali ini, ruang kosong berada di sisi kiri angka, tetapi di belakang simbol bit. ECMAScript mengisi ruang kosong ini dengan nilai simbol bit, untuk menciptakan bilangan yang lengkap, seperti yang terlihat di gambar di bawah ini:

Operasi pindah kanan bilangan 64 yang diwakili

Operasi shift kanan takberymbang

Operator shift kanan takberymbang ditandai dengan tiga tanda lebih (>>>), yang akan memgeser seluruh bit bilangan takberymbang 32 bit ke kanan. Untuk bilangan positif, hasil operasi shift kanan takberymbang sama seperti operasi shift kanan berimbang.

Dengan contoh operasi shift kanan berimbang, jika 64 digeser kanan 5 bit, akan menjadi 2:

var iOld = 64; // sama dengan biner 1000000
var iNew = iOld >>> 5; // sama dengan biner 10 desimal 2

Untuk bilangan negatif, situasi berbeda.

Operasi shift kanan takberymbang mengisi semua ruang kosong dengan 0. Untuk bilangan positif, ini sama seperti operasi shift kanan berimbang, sementara bilangan negatif akan dianggap sebagai bilangan positif.

Karena hasil operasi shift kanan takberymbang adalah bilangan positif 32 bit, penggunaan shift kanan takberymbang bilangan negatif akan selalu menghasilkan angka yang sangat besar. Contohnya, jika -64 digeser kanan 5 bit, akan mendapatkan 134217726. Bagaimana dapat mendapatkan hasil ini?

Untuk mencapai hal ini, perlu mengkonversi angka ini ke bentuk takberymbang yang setara (walaupun angka ini sendiri adalah bilangan berimbang), dapat diperoleh melalui kode berikut:

var iUnsigned64 = -64 >>> 0;

Lalu, gunakan toString() tipe Number untuk mendapatkan representasi bit yang sebenarnya, yang mengambil dasar 2:

alert(iUnsigned64.toString(2));

Ini akan menghasilkan 11111111111111111111111111000000, yang adalah ekspresi kode biner komplement negatif bilangan bulat -64, tetapi ini sama dengan bilangan takberymbang 4294967232.

Karena alasan ini, perhatian harus diberikan ketika menggunakan operator shift kanan takberymbang.