neo*_*bie 4 php bit-manipulation bit-shift zerofill
我可以知道我该怎么做 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;
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它不能完美地工作。
例如:-1149025787 >>> 0 Javascript 返回 3145941509 PHP zeroFill() 返回 0
/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)
好好享受。
小智 5
负数的速度是使用十进制-二进制转换的两倍
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));
Run Code Online (Sandbox Code Playgroud)
我在网上进行了研究,并根据给出的解释提出了我自己的零填充函数。这个方法适用于我的程序。
看一看:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5403 次 |
| 最近记录: |