PHP 等效的 javascript >>>用零填充按位运算符右移?
我可以知道如何做 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;
}
但不幸的是,它不能完美地工作。
例如:-1149025787>>>> 0 JavaScript 返回 3145941509 PHP ZeroFill() 返回 0
May I know how can I do PHP >>> ? Such operators is not available in PHP, but is available in Javascript.
I just managed to discover a function as follow:
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;
}
but unfortunately, it doesn't work perfectly.
EG: -1149025787 >>> 0
Javascript returns 3145941509
PHP zeroFill() return 0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
好好享受。
Enjoy it.
负数的速度是使用十进制-二进制转换的两倍
Twice as fast for negative numbers as using the decimal-binary conversions
我对此进行了很多研究,从 StackOverflow 和开源项目中收集了超过 11 个版本,但没有一个起作用。但最后,我找到了解决方案。
有关更多详细信息,请查看现场演示、测试和示例,查看我的问题和答案:
PHP 中的无符号右移/零填充右移(Java/JavaScript 等效)
I've researched a lot on this, collected more than 11 versions from StackOverflow and open-source projects, none of them worked. But finally, I found the solution.
For more details, live demo, tests and examples check my question and answer:
Unsigned Right Shift / Zero-fill Right Shift in PHP (Java/JavaScript equivalent)
我在网上进行了研究,并根据给出的解释提出了我自己的零填充函数。这个方法适用于我的程序。
看看:
I studied around the webs and come out with my own zerofill function, base on the explanation given. This method works for my program.
Have a look:
对于 32 位 (PHP_INT_SIZE == 4) 和 64 位整数 (PHP_INT_SIZE == 8):
For both 32-bit (PHP_INT_SIZE == 4) and 64-bit integers (PHP_INT_SIZE == 8):
您的函数不起作用,因为当
$b == 0
时,将计算表达式,返回 0。
假设是 32 位计算机,您可以添加一个特殊情况:
Your function doesn't work because when
$b == 0
, the expressionwill be evaluated, which returns 0.
Assuming 32-bit machines, you can add a special case:
不确定这是否适用于 php,我已经设法让它与 C# 一起工作。
我通过调试使用
>>>
的代码,将其与我从 javascript 转换的代码的 C# 版本进行比较,发现了这一点。在尝试使用b = 0
时,并使用科学计算器查看>>
和>>> 的不同十六进制/十进制结果
由 javascript 生成。当a
为负数时,>>>
实际上使aa为无符号。不确定这是否适用于所有场景,但对于我的情况,
>>>
用于 md5 哈希。能够产生类似的输出,我对结果非常满意。希望有帮助
Not sure if this works for php, I've manage to get it to work with C#.
I found that out by debugging into the code that uses
>>>
comparing it with C# version of the code I converted from javascript. While trying out withb = 0
, and using a scientific calculator to see the different hex/dec result of>>
and>>>
produce by javascript. Whena
is negative,>>>
actually makes aa as unsigned.Not sure if that works for all scenario, but for my case the
>>>
is for md5 hashing. Being able to produce similar output, I'm quite satisfied with the result.Hope that helps
这对我有用
This works for me