4

私は両方の言語に堪能ですが、整数のビットごとの排他的演算子または論理演算子に問題があります。JavaScriptでは1つの結果が得られ、Pythonでは別の結果が得られます..

どうぞ、pythonを開いて実行してください (-5270299) ^ 2825379669

javascript を使用して、同じ計算を行い、結果などを警告します ( http://thorat.org/OS/js.phpの例) 。

結果が違う!理由がわかりません!

私は何かが欠けているに違いありません。

4

3 に答える 3

9

longJavaScript の整数は 32 ビットですが、値が 32 ビットを超えると、Python は自動的に無制限の長さの形式に変換します。Python が 32 ビットを超えて符号拡張しないように明示的に強制した場合、または結果を 32 ビットに切り捨てた場合、結果は同じになります。

>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L
于 2010-12-21T21:14:07.417 に答える
2

282537966932 ビットに収まりません。

JavaScript の数値はすべて 64 ビットの浮動小数点数ですが、ビット単位の演算を行う場合、最初に 32 ビットの整数に変換され、次にビット単位の演算が実行され、その後 64 ビットの浮動小数点数に戻されます。

一方、Python はlong整数の値 (32 ビット以上) を問題なく処理します。

したがって、JavaScript で同じ結果が必要な場合は、64 ビット整数を 2 つの JavaScript 数値に格納し、それら 2 つの数値に対して操作を行うなど、いくつかのトリックを実行する必要があります。これは、float から int への変換、およびその逆の変換に組み込まれている、すでに恐ろしい遅い組み込みよりもさらに遅くなります。

于 2010-12-21T21:16:35.533 に答える
0

いいえ、そうではないです。Python は、より大きな整数を処理できるという事実のために、単に符号を保持します。

js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0

>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'
于 2010-12-21T21:17:28.577 に答える