JavaScript和PHP的Xor等效性

3

我有一段JavaScript代码:

var c = 267414715;
var d = c ^ ("0x81BE16CD");

结果为-1907459466

http://jsfiddle.net/4N3JY/1/

我似乎无法获得 PHP 的等效结果。已经尝试了以下方法:

<?php    
$c=267414715;

$d=$c ^ hexdec("0x81BE16CD");
echo "With hexdec: $d\n";

$d=$c ^ base_convert("0x81BE16CD", 16, 2);
echo "With base_convert(2): $d\n";

$d=$c ^ base_convert("0x81BE16CD", 16, 10);
echo "With base_convert(10): $d\n";
?>

输出:

With hexdec: 2387507830
With base_convert(2): 9223372036587361092
With base_convert(10): 2387507830

请问有人能指出正确的等价代码,并解释不同版本(base_convert / hexdec / “正确”等价版本)在工作方式上的区别吗?

1个回答

1

当使用无符号整数时,2387507830 == -1907459466(查看最低有效位的位值)

2387507830 = 0000 0000 0000 0000 0000 0000 0000 0000 1000 1110 0100 1110 0111 1010 0111 0110 -1907459466= 1111 1111 1111 1111 1111 1111 1111 1111 1000 1110 0100 1110 0111 1010 0111 0110

你的问题是32位溢出。为了补偿,你可以简单地使用 & 0xffffffff,这将使最高的32位为0,并使两个答案相同。


1
谢谢,是的,我也在尝试不同的值,并发现问题仅出现在掩码具有前导1(二进制表示中)的情况下。您能否澄清& 0xffffffff确切的位置?在掩码中吗?我希望PHP代码的行为与JS代码相同。 - workwise
变量d = (c ^ ("0x81BE16CD"))&0xffffffff; 这个想法是将上32位清零,“&”表示结果只有在两个操作数都为1时才为1,由于一个操作数在上32位始终为0,因此这些位的结果始终为0。 - Zack Newsham
嗯,我必须让 PHP 代码像 JS 一样运行。此外,我认为问题出在 c 的 msb 和掩码不同。感谢您的帮助。我正在尝试根据您的答案整理思路。 - workwise
谢谢,是的,现在明白了。我正在找出如何在PHP中使用64位整数(你是否知道一种简单的方法)? - workwise
取决于,这个命令的输出是什么:php -r 'echo PHP_INT_MAX;' - Zack Newsham
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接