1. ホーム
  2. ジャバスクリプト

[解決済み】Javascriptで~~("ダブルチルダ")は何をするのですか?

2022-04-06 02:16:54

質問

今日、オンラインゲームの物理ライブラリをチェックしていたら、~~演算子に出会いました。 単一の ~ がビット単位の NOT であることは知っていますが、~~ は NOT の NOT になり、同じ値が返されるのではないでしょうか?

どのように解決するのですか?

ビット演算子はオペランドを暗黙のうちに符号付き32ビット整数に変換するので、小数点以下はすべて削除されます。これはオペランドが(浮動小数点)数であっても文字列であっても、また結果が数であっても機能します。

つまり、降伏するのである。

function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);
}

場合のみ x が-(2)の間にある場合 31 ) と 2 31 - そうでない場合は、オーバーフローが発生し、数値が折り返されます。

これは、関数の文字列引数を数値に変換するのに便利だと思われるかもしれませんが、オーバーフローの可能性があることと、整数以外での使用は正しくないので、私は、quot;コードゴルフ"を除いて、この方法で使うことはありません(笑)。 すなわち プログラムのソースコードから無意味にバイトを削り取り、可読性と堅牢性を犠牲にする) 私なら +x または Number(x) の代わりに


これがいかにNOTのNOTであるか

例えば、-43.2という数字は。

-43.2 <サブ 10 = 11111111111111111111111111010101 <サブ 2

を符号付き(2の補数)32ビット2進数で表現します。(JavaScriptでは小数点以下は無視されます)ビットを反転させると

NOT -43 <サブ 10 = 00000000000000000000000000101010 <サブ 2 = 42 <サブ 10

再び反転させると得られる。

NOT 42 <サブ 10 = 11111111111111111111111111010101 <サブ 2 = -43 <サブ 10

とは異なります。 Math.floor(-43.2) 負の数はゼロから離れるのではなく、ゼロの方向に丸められるという点です。(floor関数は-44となり、数値が正か負かに関係なく、常に次の小さい整数に切り捨てられます)。