32 / 64b PHP上的按位运算符

时间:2013-05-11 12:57:41

标签: php

如何在PHP的64位机器上获得结果-1098394484:

32B

echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // =>  -1098394484

64B

echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // => 3196572812, but need  -1098394484

1 个答案:

答案 0 :(得分:3)

试一试:

    1 049 089 164 = 0b00111110100001111101010010001100
    2 147 483 648 = 0b10000000000000000000000000000000
    XOR:
                  = 0b10111110100001111101010010001100
    3 196 572 812 = 0b10111110100001111101010010001100 -> OK, if 64 bit
   -1 098 394 484 = 0b10111110100001111101010010001100 -> OK, if 32-bit two complement

所以实际上两者都很好!无论如何,VAR ^ 0 ^ 0 = VAR(因为两个xors是幂等的)。

无论如何,在输出上使用0xABCDEF09(hexa)格式。试试这两个(不幸的是我不能在32位上为你做):

echo 1049089164 ^ 2147483648; // =>  -1098394484
echo "<br/>";
echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // =>  -1098394484
echo "<br/>";
echo dechex(1049089164 ^ 2147483648); // => 3196572812, but need  -1098394484
echo "<br/>";
echo dechex(1049089164 ^ 2147483648 ^ 0 ^ 0); // => 3196572812, but need  -1098394484

输出:

3196572812
3196572812
be87d48c
be87d48c

或者你可以在这里试试:http://writecodeonline.com/在PHP5中,你得到我写的输出,但在PHP4中,你得到-1098394484。使用echo PHP_INT_SIZE;确定架构(4表示32位,8表示64位,该站点在php5中为64位,在php4中为32位)。

那么你真正想要在两种体系结构上强制INT为4个字节。请参阅另一个SO问题:Force PHP integer overflow

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}

echo intval32bits(1049089164 ^ 2147483648 ^ 0 ^ 0);

所以你有解决方案。