我可以知道如何做PHP>>> ?这些运算符在PHP中不可用,但可以在Javascript中使用。
我刚刚设法发现了如下函数:
function zeroFill($a, $b)
{
$z = hexdec(80000000);
if ($z & $a)
{
$a = ($a>>1);
$a &= (~$z);
$a |= 0x40000000;
$a = ($a>>($b-1));
}
else
{
$a = ($a>>$b);
}
return $a;
}
但不幸的是,它并不完美。
EG:-1149025787>>> 0 Javascript返回3145941509 PHP zeroFill()返回0
答案 0 :(得分:3)
负数的速度是使用十进制二进制转换的两倍
function zerofill($a,$b) {
if($a>=0) return $a>>$b;
if($b==0) return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1);
return ((~$a)>>$b)^(0x7fffffff>>($b-1));
答案 1 :(得分:3)
我对此进行了大量研究,从StackOverflow和开源项目中收集了11个以上的版本,但都没有。但最后,我找到了解决方案。
有关详细信息,现场演示,测试和示例请查看我的问题和答案:
Unsigned Right Shift / Zero-fill Right Shift in PHP (Java/JavaScript equivalent)
function unsignedRightShift($a, $b) {
if ($b >= 32 || $b < -32) {
$m = (int)($b/32);
$b = $b-($m*32);
}
if ($b < 0) {
$b = 32 + $b;
}
if ($b == 0) {
return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1);
}
if ($a < 0)
{
$a = ($a >> 1);
$a &= 0x7fffffff;
$a |= 0x40000000;
$a = ($a >> ($b - 1));
} else {
$a = ($a >> $b);
}
return $a;
}
答案 2 :(得分:3)
/**
* The >>> javascript operator in php x86_64
* Usage: -1149025787 >>> 0 ---> rrr(-1149025787, 0) === 3145941509
* @param int $v
* @param int $n
* @return int
*/
function rrr($v, $n)
{
return ($v & 0xFFFFFFFF) >> ($n & 0x1F);
}
/**
* The >> javascript operator in php x86_64
* @param int $v
* @param int $n
* @return int
*/
function rr($v, $n)
{
return ($v & 0x80000000 ? $v | 0xFFFFFFFF00000000 : $v & 0xFFFFFFFF) >> ($n & 0x1F);
}
/**
* The << javascript operator in php x86_64
* @param int $v
* @param int $n
* @return int
*/
function ll($v, $n)
{
return ($t = ($v & 0xFFFFFFFF) << ($n & 0x1F)) & 0x80000000 ? $t | 0xFFFFFFFF00000000 : $t & 0xFFFFFFFF;
}
享受吧。
答案 3 :(得分:1)
我研究了网络并根据给出的解释提出了我自己的zerofill功能。这种方法适用于我的程序。
看看:
function zeroFill($a,$b) {
if ($a >= 0) {
return bindec(decbin($a>>$b)); //simply right shift for positive number
}
$bin = decbin($a>>$b);
$bin = substr($bin, $b); // zero fill on the left side
$o = bindec($bin);
return $o;
}
答案 4 :(得分:1)
您的功能不起作用,因为$b == 0
表达式
$a >> -1
将评估,返回0。
假设32位计算机,您可以添加一个特殊情况:
if ($z & $a) {
if ($b == 0)
return $a + 0x100000000;
else {
...
答案 5 :(得分:1)
不确定这是否适用于php,我已经设法让它与C#一起使用。
int a, b, result;
//Instead of
result = a >>> b;
//I do
result = (int)((uint)a >> b);
我发现通过调试使用>>>
的代码将其与我从javascript转换的代码的C#版本进行比较。在尝试使用b = 0
时,使用科学计算器查看javascript生成>>
和>>>
的不同十六进制/十六进制结果。当a
为否定时,>>>
实际上将aa视为无符号。
不确定这是否适用于所有情况,但对于我的情况,>>>
适用于md5哈希。能够产生类似的输出,我对结果非常满意。
希望有所帮助
答案 6 :(得分:1)
对于32位(PHP_INT_SIZE == 4)和64位整数(PHP_INT_SIZE == 8):
function SHR
($x, $c)
{
$x = intval ($x); // Because 13.5 >> 0 returns 13. We follow.
$nmaxBits = PHP_INT_SIZE * 8;
$c %= $nmaxBits;
if ($c)
return $x >> $c & ~ (-1 << $nmaxBits - $c);
else
return $x;
}
答案 7 :(得分:0)
这对我有用
function RRR($a, $b){
return (int)((float)$a/pow(2,(int)$b));
}