Kata -kata sebelumnya
Operator bit adalah operasi yang sangat mendasar dan tidak umum digunakan karena tidak intuitif. Namun, ini sangat cepat dan dapat mencapai hasil yang baik saat digunakan secara wajar. Artikel ini akan memperkenalkan operator yang sering diabaikan di JavaScript - Bit Operator
Representasi biner
Semua nilai dalam ecmascript disimpan dalam format IEEE-754 64-bit, tetapi operator bit tidak secara langsung mengoperasikan nilai 64-bit, tetapi dihitung sebagai integer yang ditandatangani 32-bit, dan nilai pengembalian juga merupakan integer yang ditandatangani 32-bit.
Konversi bit ini memungkinkan kedua nilai diperlakukan sebagai 0 saat menerapkan operasi bit ke NAN khusus dan nilai infinity khusus
Jika operator bit diterapkan pada nilai non-numerik, nilainya akan dikonversi menjadi nilai numerik menggunakan angka () terlebih dahulu, dan hasilnya adalah nilai numerik
// '|' berarti bitwise atau, bilangan bulat dan 0 bitwise atau operasi dapat memperoleh dirinya sendiri, dan desimal dan 0 bitwise atau operasi dapat memperoleh konsol efek pembulatan. 0); // 0console.log ('12px' | 0); // 0console.log ('12 '| 0); // 12Integer yang ditandatangani menggunakan 31 pertama dari 32-bit untuk mewakili nilai integer, 32-bit untuk mewakili simbol integer, 0 mewakili angka positif, dan 1 mewakili angka negatif. Bit yang mewakili simbol disebut bit tanda, dan nilai bit tanda menentukan format nilai bit lainnya. Di antara mereka, bilangan positif disimpan dalam format biner murni, dan masing -masing dari 31 bit mewakili kekuatan 2. Bit pertama (disebut bit 0) mewakili 0 kali 2, bit kedua mewakili 1 kali 2, dan seterusnya. Bit yang tidak digunakan diisi dengan 0, mis. Mereka diabaikan.
Misalnya, representasi biner dari nilai numerik 18 adalah 00000000000000000000000000000010010, atau lebih ringkas 10010. Ini adalah 5 bit yang valid, dan 5 bit ini sendiri menentukan nilai aktual
Console.log ((18) .Tostring (2)); // "10010"
Console.log (0B0000000000000000000000000000000010010); // 18
Angka -angka negatif juga disimpan dalam biner, tetapi format yang digunakan dalam komplemen dua. Untuk menghitung komplemen dua numerik, Anda harus melalui 3 langkah berikut:
【1】 Temukan kode biner dari nilai absolut dari nilai numerik ini
【2】 Temukan kode terbalik biner, yaitu, ganti 0 dengan 1, ganti 1 dengan 0
【3】 Kode terbalik biner yang diperoleh ditambahkan ke 1
Misalnya, untuk menentukan representasi biner -18, Anda harus terlebih dahulu mendapatkan representasi biner dari 18, seperti yang ditunjukkan di bawah ini:
0000 0000 0000 0000 0000 0000 0001 0010
Selanjutnya, hitung kode terbalik biner sebagai berikut:
1111 1111 1111 1111 1111 1111 1111 1110 1101
Akhirnya, tambahkan 1 ke kode terbalik biner, sebagai berikut:
1111 1111 1111 1111 1111 1111 1110 1101 1 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Oleh karena itu, representasi biner -18 adalah 1111 1111 1111 1111 1111 1111 1111 1111 1110 1110
Ecmascript akan mencoba yang terbaik untuk menyembunyikan semua informasi ini dari kami. Saat mengeluarkan angka negatif dalam bentuk string biner, yang kita lihat adalah bahwa kode biner dengan nilai absolut dari angka negatif ini didahului oleh tanda negatif.
var num = -18; console.log (num.tostring (2)); // ' -10010'
Operator bit dapat melakukan 7 jenis operasi, termasuk bitwise non (tidak), bitwise dan (dan), bitwise atau (atau), bitwise eksklusif atau (xor), shift kiri, pergeseran kanan yang ditandatangani dan pergeseran kanan yang tidak ditandatangani.
Bitwise non (tidak)
Bitwise non-operator diwakili oleh garis bergelombang (~). Hasil dari menjalankan bitwise non-operator adalah mengembalikan kode terbalik dari nilai. Esensinya adalah minus nilai negatif operan dengan 1
var num1 = 25; var num2 = ~ num1; console.log (num2); //-26
Anda bisa mendapatkan efek pembulatan dengan bitwitwise ganda untuk bilangan bulat; Anda bisa mendapatkan efek pembulatan dengan bitwise ganda untuk desimal.
console.log (~~ 3); // 3console.log (~~ 3.1); // 3console.log (~~ 3.9); // 3
Bitwise dan (dan)
Bitwise dan operator diwakili oleh simbol SUM (&), yang memiliki dua nomor operator. Pada dasarnya, bitwise dan operasi adalah untuk menyelaraskan setiap bit dari dua nilai, dan kemudian melakukan dan operasi pada dua angka pada posisi yang sama sesuai dengan aturan dalam tabel berikut.
Bit nilai pertama dari hasil bit nilai kedua 1 1 11 0 00 1 00 0 0 0 0
Bitwise dan Operation akan mengembalikan 1 hanya jika bit yang sesuai dari dua nilai adalah 1. Bit apa pun adalah 0, dan hasilnya adalah 0.
var iresult = 25 & 3; console.log (iresult); // "1"
// Analisis adalah sebagai berikut 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
bitwise atau (atau)
Bitwise atau operator diwakili oleh simbol vertikal (|), dan ada juga dua operan. Bitwise atau operasi mengikuti tabel kebenaran berikut
Bit nilai pertama dari hasil bit nilai kedua 1 1 11 0 10 1 10 0 0 0
Bitwise atau operasi mengembalikan 1 jika satu bit adalah 1, dan hanya jika kedua bit adalah 0.
var iresult = 25 | 3; Console.log (IResult); // "27"
// Analisis adalah sebagai berikut 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1011
Bilangan bulat dan 0 bitwise atau operasi bisa mendapatkannya, dan desimal dan 0 bitwise atau operasi bisa mendapatkan efek pembulatan
Console.log (3.1 | 0); // 3console.log (3.9 | 0); // 3
Bitwise xor (xor)
Operator Bitwise XOR diwakili oleh Caret (^) dan memiliki dua operan. Berikut ini adalah tabel kebenaran bitwise xor
Bit dari nilai pertama bit dari nilai kedua 1 1 01 0 10 1 10 0 0 0
Mengembalikan 0 ketika dua nilai bitwise xor sama, dan mengembalikan 1 saat tidak pada saat yang sama
var iresult = 25 ^ 3; console.log (iresult); // "26"
// Analisis adalah sebagai berikut 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1010
"Operasi Ekoroor" memiliki penggunaan khusus, yang melakukan tiga operasi XOR pada dua angka A dan B secara berurutan, aˆ = b, bˆ = a, aˆ = b, dan nilainya dapat ditukar. Ini berarti bahwa menggunakan "eksklusif atau operasi" dapat menukar nilai dua variabel tanpa memperkenalkan variabel sementara
var a = 10, b = 9; a ^= b, b ^= a, a ^= b; console.log (a, b); // 9,10
// Analisis adalah sebagai berikut A = 0000 0000 0000 0000 0000 0000 0000 0000 1010 B = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 1001 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Integer dengan 0 bitwise xor dapat menjaga dirinya sendiri, dan desimal dengan 0 bitwise xor dapat dibulatkan
Console.log (3.1 ^ 0); // 3console.log (3.9 ^ 0); // 3
Bergerak ke kiri
Operator shift kiri diwakili oleh dua tanda kurang dari (<<). Operator ini akan memindahkan semua bit nilai ke kiri dengan jumlah bit yang ditentukan.
Misalnya, jika nilai 2 (kode biner adalah 10) digeser 5 bit ke kiri, hasilnya adalah 64 (1000000)
var oldValue = 2; var newValue = oldValue << 5; console.log (newValue); // 64
Bergerak ke kiri tidak akan mempengaruhi bit tanda operan. Dengan kata lain, jika -2 dipindahkan 5 bit ke kiri, hasilnya akan -64
var oldvalue = -2; var newValue = oldValue << 5; console.log (newValue); // -64
Shift kiri 0 bit dapat mencapai efek pembulatan
Console.log (3.1 << 0); // 3console.log (3.9 << 0); // 3
Ditandatangani dengan benar
Operator shift kanan yang ditandatangani diwakili oleh dua lebih dari tanda (>>), yang menggerakkan nilai ke kanan, tetapi mempertahankan bit tanda (mis., Tanda tanda). Operasi shift kanan yang ditandatangani adalah kebalikan dari operasi shift kiri, yaitu, jika 64 dipindahkan 5 bit ke kanan, hasilnya akan diubah kembali menjadi 2.
var oldvalue = 64; var newValue = oldValue >> 5; console.log (newValue); // 2
Demikian pula, selama proses pemindahan, lowongan juga akan muncul dalam nilai aslinya. Namun, kali ini lowongan muncul di sisi kiri dari nilai asli dan di sisi kanan bit tanda. Saat ini, ecmascript akan mengisi semua ruang kosong dengan nilai bit tanda untuk mendapatkan nilai lengkap
Bergerak ke kanan untuk mensimulasikan operasi pembagi 2
console.log (5 >> 1); // 2console.log (15 >> 1); // 7
Hak yang tidak ditandatangani
Operator shift kanan yang tidak ditandatangani diwakili oleh 3 lebih besar dari tanda (>>>), yang menggerakkan semua 32 bit nilai ke kanan. Untuk bilangan positif, hasil dari pergeseran kanan yang tidak ditandatangani sama dengan pergeseran kanan yang ditandatangani. Lebih mudah untuk memindahkan tanda tepat di depannya. Jika Anda memindahkan 64 dengan 5 bit yang tidak ditandatangani, hasilnya masih 2
var oldvalue = 64; var newValue = oldValue >>> 5; console.log (newValue); // 2
Namun, angka negatifnya berbeda. Pertama, shift kanan yang tidak ditandatangani mengisi bit kosong dengan 0, alih -alih mengisi bit kosong dengan nilai bit yang ditandatangani seperti shift kanan yang ditandatangani. Oleh karena itu, hasil pergeseran kanan tanpa tanda ke angka positif sama dengan hasil pergeseran judul ke judul, tetapi hasil dari angka negatif berbeda. Kedua, operator shift kanan yang tidak ditandatangani akan memperlakukan kode biner negatif sebagai kode biner positif. Selain itu, karena angka negatif diwakili dalam komplemen kedua dari nilai absolutnya, hasilnya akan sangat besar setelah pergeseran kanan yang tidak ditandatangani.
var oldvalue = -64; var newValue = oldvalue >>> 5; console.log (newValue) // 134217726
Untuk menentukan representasi biner -64, Anda harus terlebih dahulu mendapatkan representasi biner dari 64, seperti yang ditunjukkan di bawah ini:
0000 0000 0000 0000 0000 0000 0100 0000
Selanjutnya, hitung kode terbalik biner sebagai berikut:
1111 1111 1111 1111 1111 1111 1111 1011 11111
Akhirnya, tambahkan 1 ke kode terbalik biner seperti yang ditunjukkan di bawah ini
1111 1111 1111 1111 1111 1111 1111 1011 1111 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Setelah bergerak 5 bit ke kanan, seperti yang ditunjukkan di bawah ini:
0000 0111 1111 1111 1111 1111 11111 11111 1110Console.log (0B00000111111111111111111111111111111111111111111111111111110); // 134217726
Aplikasi umum
【1】 Operasi berganda
Gunakan shift kiri (<<) untuk mewujudkan operasi perkalian
console.log (2 << 1); // 4console.log (3 << 1); // 6console.log (4 << 1); // 8
【2】 Bagi operasi
Gunakan shift kanan yang ditandatangani (>>) untuk mensimulasikan operasi pembagi 2
Console.log (2 >> 1); // 1console.log (5 >> 1); // 2console.log (8 >> 1); // 4console.log (9 >> 1); // 4console.log (9 >> 1); // 4
【3】 Pertukaran Nilai
Efek nilai pertukaran dapat dicapai dengan menggunakan operasi xor (^)
var a = 10, b = 9; a ^= b, b ^= a, a ^= b; console.log (a, b); // 9,10
【4】 Ringkas desimal
Efek pembulatan desimal dapat dicapai dengan mengambil dua bitwise non-bit, 0 bitwise atau, 0 bitwise atau, 0 bit kiri dan 0 bit kanan.
console.log (~~ 3.1); // 3console.log (3.1 | 0); // 3console.log (3.1^0); // 3console.log (3.1 << 0); // 3console.log (3.1 >> 0); // 3console.log (3.1> 0);
【5】 sakelar
Operator bit dapat digunakan sebagai sakelar untuk mengatur properti objek. Asumsikan bahwa suatu objek memiliki empat sakelar, masing -masing sakelar adalah variabel. Kemudian, Anda dapat mengatur angka biner empat-bit, yang masing-masing sesuai dengan sakelar.
var flag_a = 1; // 0001var flag_b = 2; // 0010var flag_c = 4; // 0100var flag_d = 8; // 1000
Kode di atas menetapkan empat sakelar A, B, C, dan D, masing -masing sakelar memiliki bit biner masing -masing.
Sekarang anggaplah bahwa ketiga sakelar ABD perlu dihidupkan, kita dapat membangun variabel topeng
var mask = flag_a | Flag_b | Flag_d; // 0001 | 0010 | 1000 => 1011
Kode di atas melakukan "atau operasi" pada tiga variabel ABD untuk mendapatkan 1011 dengan nilai topeng biner
// "Operasi" memastikan bahwa sakelar yang ditentukan dihidupkan pada flag = bendera | masker;
// "Asosiasi" dapat mematikan semua item dalam pengaturan saat ini yang berbeda dari pengaturan sakelar. Bendera = Bendera & Topeng;
// "Eksklusif atau Operasi" dapat beralih ke (beralih) pengaturan saat ini, yaitu, nilai terbalik dari pengaturan saat ini dapat diperoleh untuk pertama kalinya, dan nilai asli dapat diperoleh dengan mengeksekusi lagi. Bendera = Bendera ^ Topeng;
// "Tidak ada operasi" yang dapat membalik pengaturan saat ini, yaitu, pengaturan aslinya adalah 0, dan menjadi 1 setelah operasi; Pengaturan asli adalah 1, dan menjadi 0flag setelah operasi = ~ bendera;
Pengantar komprehensif di atas untuk operator JavaScript - BIT Operator adalah seluruh konten yang dibagikan oleh editor. Saya harap ini dapat memberi Anda referensi dan saya harap Anda akan lebih mendukung wulin.com.