2010-12-21 9 views
3

私は両方の言語に堪能です...しかし、ビット単位の排他的論理演算子に問題があります。 JavaScriptでは、それは私に別のものを与え、Pythonで、私の1件の結果を与える。..Python/Javascript - 整数のビット単位の排他的または問題

を、先に行くオープンPythonと実行JavaScriptを使用して今(-5270299)^ 2825379669

、同じ計算を行い、および警告結果など(例:http://thorat.org/OS/js.php

結果は異なります。なぜ私は分かりません!

私は何かが不足しているはずです。

答えて

8

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

>>> (-5270299 & 0xFFFFFFFF)^2825379669 
1472744368L 
>>> (-5270299^2825379669) & 0xFFFFFFFF 
1472744368L 
2

2825379669は32ビットに収まらないありません。

JavaScriptの数字はすべて64ビットの浮動小数点数ですが、ビット単位の演算を行うと32ビットの整数に変換された後、ビット単位の演算が実行され、その後64ビットの浮動小数点に変換されます。

一方、Pythonは整数のためにlong値(32ビット以上)をうまく処理します。

JavaScriptで同じ結果が必要な場合は、64ビット整数を2つのJavaScript番号に格納し、その2つの操作を実行するなどのトリックを行う必要があります。浮動小数点のintとbackへの変換に組み込まれた既に恐ろしい遅さよりもさらに遅くなります。

0

いいえ、そうではありません。 Pythonはより大きな整数を扱うことができるという理由から単に記号を保持しています。

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

>>> hex((-5270299^2825379669)) 
'-0xa837b450' 
>>> hex((-5270299^2825379669)+2**32) 
'0x57c84bb0' 
関連する問題