Php 使用带负数的位移位

Php 使用带负数的位移位,php,bitwise-operators,gmp,Php,Bitwise Operators,Gmp,我试图获得与在64位机器上使用GMP函数的按位运算符相同的返回值,但它在负数上不这样做 不久前我问了一个几乎相同的问题,但那条线索完全消失了。最上面的答案基本上是建议我编辑PHP底层的C代码,但由于我使用托管,所以我无法处理源代码(更不用说在这种解决方案中缺乏可移植性) 我使用GMP函数是因为我需要处理32位系统不能给出正确结果的较大数字。我也尝试过使用BC数学函数,但它们在负s上也有同样的问题。您对右移的实现是不正确的。右移得到的结果与二次幂除法相同,只要结果不大于负数的-1。php手册中给出

我试图获得与在64位机器上使用GMP函数的按位运算符相同的返回值,但它在负数上不这样做

不久前我问了一个几乎相同的问题,但那条线索完全消失了。最上面的答案基本上是建议我编辑PHP底层的C代码,但由于我使用托管,所以我无法处理源代码(更不用说在这种解决方案中缺乏可移植性)


我使用GMP函数是因为我需要处理32位系统不能给出正确结果的较大数字。我也尝试过使用BC数学函数,但它们在负s上也有同样的问题。

您对右移的实现是不正确的。右移得到的结果与二次幂除法相同,只要结果不大于负数的-1。php手册中给出的示例清楚地说明了这一点:

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

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