2

JavaScript での関数:

function int64add(dst, x, y)
{
    var w0 = (x.l & 0xffff) + (y.l & 0xffff);
    var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
    var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
    var w3 = (x.h >>> 16) + (y.l >>> 16) + (w2 >>> 16);
    dst.l = (w0 & 0xffff) | (w1 << 16);
    dst.h = (w2 & 0xffff) | (w3 << 16);
}

この JavaScript を PHP に次のように変換しました: PHP の関数:

function int64add($dst, $x, $y)
{
    $w0 = ($x->l & 0xffff) + ($y->l & 0xffff);
    $w1 = ($x->l >> 16) + ($y->l >> 16) + ($w0 >> 16);
    $w2 = ($x->h & 0xffff) + ($y->h & 0xffff) + ($w1 >> 16);
    $w3 = ($x->h >> 16) + ($y->l >> 16) + ($w2 >> 16);
    $dst->l = ($w0 & 0xffff) | ($w1 << 16);
    $dst->h = ($w2 & 0xffff) | ($w3 << 16);
}

これら 2 つの関数は、同じ入力に対して異なる出力を返します。インターネットで検索してみましたが、何も見つかりませんでした。助けてください!

JS で:

入力:

dst:

int64{
    h=1779033703,
    l=-205731576
}

バツ:

int64{
    h=1779033703,
    l=-205731576
}

y:

int64{
    h=1779033703,
    l=-205731576
}

戻り値:

int64{
    h=-736899889,
    l=-411463152
}

PHPで:

入力:

dst:

int64{
    h=1779033703,
    l=-205731576
}

バツ:

int64{
    h=1779033703,
    l=-205731576
}

y:

int64{
    h=1779033703,
    l=-205731576
}

戻り値:

int64{
    h=-736899891,
    l=-411463152
}

PHP のクラス int64:

class int64{
    var $h;
    var $l;
    function int64($h,$l){
        $this->h=$h;
        $this->l=$l;
    }
}

js の関数 int64:

    function int64(h,l){
        this.h=h;
        this.l=l;
    }

PHP に Javascript として出力してもらいたい。(Javascriptは正しいものです)

4

1 に答える 1

0

>>>これは、PHPで演算子を適切に処理していないためです。& 0xffff右シフト操作の後に使用して、上位ビットを必ずクリアする必要があります。

$w0 = ($x->l & 0xffff) + ($y->l & 0xffff);
$w1 = (($x->l >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w0 >> 16) & 0xffff);
$w2 = ($x->h & 0xffff) + ($y->h & 0xffff) + ($w1 >> 16);
$w3 = (($x->h >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w2 >> 16) & 0xffff);

そうすることで私には同じ価値が与えられましたが、それらはあなたのものとは異なっていました。入力値がすべて同じではなかった可能性があります(コピーと貼り付けの間違い?)

object(int64)#1 (2) {
  ["h"]=>
  int(1573309647)
  ["l"]=>
  int(-411463152)
}

他の人が言っているように、私はGMPまたはBCMathの使用を真剣に検討したいと思います。

于 2012-10-23T09:28:33.580 に答える