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

标签 php

如何在 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(十六进制)格式。在两者上都尝试一下(不幸的是,我无法在 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);

所以你有你的解决方案。

关于php - 32/64b PHP 上的按位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16497341/

相关文章:

php - MySQL从多个表中选择

php - 移动浏览器的 Javascript/PHP 页面超时

php - 我们可以在内存缓存中存储具有相同键的多条记录吗?

php - 验证数组是否已存在于 mysql php laravel 中

PHP无法在ubuntu中连接到postgreSQL

php - google calendar watch过期时间超过1个月?

php - 如何在不丢失数据的情况下更新整个数据库

php - 将 mysqli 转换为 pdo bind_all

php - 限制数据库中的表,用户可以在 Laravel 中运行查询

php - INSERT IGNORE INTO 不起作用