如何在 PHP 中的 64 位机器上获得结果 -1098394484:
32b
echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // => -1098394484
64b
echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // => 3196572812, but need -1098394484
如何在 PHP 中的 64 位机器上获得结果 -1098394484:
32b
echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // => -1098394484
64b
echo 1049089164 ^ 2147483648 ^ 0 ^ 0; // => 3196572812, but need -1098394484
试试看:
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(因为两个异或一起是幂等的)。
无论如何,在输出上使用 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。使用回声 PHP_INT_SIZE;确定架构(4 表示 32 位,8 表示 64 位,该站点在 php5 中为 64 位,在 php4 中为 32 位)。
因此,您真正想要在两种架构上将 INT 强制为 4 个字节。请参阅另一个 SO 问题:强制 PHP 整数溢出
function intval32bits($value)
{
$value = ($value & 0xFFFFFFFF);
if ($value & 0x80000000)
$value = -((~$value & 0xFFFFFFFF) + 1);
return $value;
}
echo intval32bits(1049089164 ^ 2147483648 ^ 0 ^ 0);
所以你有你的解决方案。