使用带负数的GMP bitshift

时间:2011-07-24 20:40:39

标签: php bitwise-operators gmp

echo -1 >> 8; //returns -1

function gmp_shiftr($x,$n) { // shift right
  return(gmp_div($x,gmp_pow(2,$n)));
}

echo gmp_strval(gmp_shiftr(-1, 8)); //returns 0

我试图获得相同的返回值,否则我会从具有GMP功能的64位机器上的按位运算符获得,但它不会在负数上执行此操作。

前一段时间我问了一个非常相同的question,但那个线程完全死了。最佳答案基本上建议我编辑基础PHP的C代码,但由于我在托管主机上,我无法搞乱源代码(更不用说在这样的解决方案中缺乏可移植性)。

我正在使用GMP功能,因为我需要处理更大的数字,32位系统无法提供正确的结果。我也试过使用BC数学函数,但它们与负#s。

有相同的问题

1 个答案:

答案 0 :(得分:0)

您的右移实施不正确。只要结果对于负数不大于-1,右移给出与具有2的幂的除法相同的结果。这在php手册中给出的例子中很清楚:

http://php.net/manual/en/language.operators.bitwise.php

解决方法是检查给定的$ x是否为负数,但是大于-2 ^ $ n,如果是,则直接返回-1。