Saya sedang memeriksa perpustakaan fisika game online hari ini dan menemukan operator ~~. Saya tahu satu ~ TIDAK sedikit pun, akankah itu membuat ~~ TIDAK dari TIDAK, yang akan memberikan kembali nilai yang sama, bukan?
javascript
Shane Tomlinson
sumber
sumber
Jawaban:
Ini menghapus semuanya setelah titik desimal karena operator bitwise secara implisit mengubah operan mereka menjadi bilangan bulat 32-bit yang ditandatangani. Ini berfungsi baik operan berupa angka atau string, dan hasilnya adalah angka.
Dengan kata lain, itu menghasilkan:
hanya jika x berada di antara - (2 31 ) dan 2 31 - 1. Jika tidak, overflow akan terjadi dan nomor akan "membungkus".
Ini mungkin dianggap berguna untuk mengubah argumen string fungsi menjadi angka, tetapi keduanya karena kemungkinan overflow dan bahwa itu salah untuk digunakan dengan non-integer, saya tidak akan menggunakannya seperti itu kecuali untuk "kode golf" ( yaitu tanpa memotong poin dari kode sumber program Anda dengan mengorbankan keterbacaan dan ketahanan). Saya akan menggunakan
+x
atauNumber(x)
sebagai gantinya.Bagaimana ini BUKAN BUKAN BUKAN
Angka -43.2, misalnya adalah:
sebagai nomor biner 32-bit yang ditandatangani (komplemen dua). (JavaScript mengabaikan apa yang setelah titik desimal.) Membalik bit memberi:
Pembalikan lagi memberi:
Ini berbeda dari
Math.floor(-43.2)
angka negatif dibulatkan ke nol, tidak jauh dari itu. (Fungsi lantai, yang akan sama dengan -44, selalu dibulatkan ke bilangan bulat bawah berikutnya, terlepas dari apakah angka tersebut positif atau negatif.)sumber
~~
adalah cara singkat (dan mungkin solusi yang baik?) Untuk membuat fungsi truncate , tetapi jelas dalam javascript .~~
.Operator ~ pertama memaksa operan ke integer (mungkin setelah memaksa nilai ke string atau boolean), kemudian membalikkan 31 bit terendah. Nomor ECMAScript resmi semuanya adalah floating-point, tetapi beberapa angka diimplementasikan sebagai bilangan bulat 31-bit di mesin SpiderMonkey.
Anda bisa menggunakannya untuk mengubah array 1 elemen menjadi integer. Floating-point dikonversi sesuai dengan aturan C, yaitu. pemotongan bagian fraksional.
Operator ~ kedua kemudian membalikkan bit kembali, sehingga Anda tahu bahwa Anda akan memiliki integer. Ini tidak sama dengan memaksa nilai ke boolean dalam pernyataan kondisi, karena objek kosong {} bernilai true, sedangkan ~~ {} bernilai false.
sumber
~~undefined // 0
~~null // 0
~
melakukan apa yang Anda deskripsikan~
lakukan pertama dan sebaliknya. The~
operator adalah operator unary dan interpereted dari kanan ke kiri~~X
seperti~(~X)
tidak seperti(~~)X
(yang akan menjadi kesalahan sintaks)Dalam ECMAScript 6, setara dengan
~~
adalah Math.trunc :Polyfill:
sumber
The
~
tampaknya melakukan-(N+1)
. Jadi,~2 == -(2 + 1) == -3
jika Anda melakukannya lagi pada -3, ia akan mengembalikannya:~-3 == -(-3 + 1) == 2
Ini mungkin hanya mengubah string menjadi angka dengan cara berputar-putar.Lihat utas ini: http://www.sitepoint.com/forums/showthread.php?t=663275
Juga, info lebih rinci tersedia di sini: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
sumber
Diberikan
~N
adalah-(N+1)
,~~N
lalu-(-(N+1) + 1)
. Yang jelas mengarah pada trik yang rapi .sumber
Hanya sedikit peringatan. Jawaban lain di sini membuat saya kesulitan.
Tujuannya adalah untuk menghapus apa pun setelah titik desimal dari angka titik mengambang, tetapi memiliki beberapa kasus sudut yang membuatnya menjadi bahaya bug. Saya sarankan menghindari ~~.
Pertama, ~~ tidak bekerja pada angka yang sangat besar.
~~1000000000000 == -727279968
Sebagai alternatif, gunakan
Math.trunc()
(seperti yang disebutkan Gajus,Math.trunc()
mengembalikan bagian integer dari angka floating point tetapi hanya tersedia di JavaScript yang sesuai dengan ECMAScript 6). Anda selalu dapat membuat sendiriMath.trunc()
untuk lingkungan non-ECMAScript-6 dengan melakukan ini:Saya menulis posting blog tentang ini untuk referensi: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
sumber
Berikut adalah contoh bagaimana operator ini dapat digunakan secara efisien, di mana masuk akal untuk menggunakannya:
Sumber:
Lihat bagian Berinteraksi dengan poin
sumber
Mengubah String ke Angka
~ -1 adalah 0
sumber
sumber
Tilde (~) memiliki algorihm - (N + 1)
Untuk memeriksa:
Double tilde adalah - (- (N + 1) +1)
Sebagai contoh:
Triple tilde adalah - (- (- (N + 1) +1) +1)
Sebagai contoh:
sumber