gpt4 book ai didi

php - 有人可以将它移植到 C 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:34 24 4
gpt4 key购买 nike

我花了最后几个小时尝试将其移植到 C,但没有成功。有人可以帮忙吗?

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;
}

最佳答案

怎么样

unsigned int zerofill(unsigned int a, int b) {
return a >> b;
}

或者,

int zerofill(int a, int b) {
return ((unsigned int)a) >> b;
}

在 C 中,如果左操作数是有符号的,则右移运算符充当算术移位,如果无符号,则充当逻辑移位。看起来原始的 PHP 代码将花费一些时间来仅使用带符号的移位来获得无符号的移位。

C99 标准第 6.5.7 节说:

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

这清楚地表明,要移入零位,操作数必须是无符号的,或者是有符号的正数。唯一的问题是当操作数有符号且为负时的行为,结果是实现定义的。实际上,我遇到的每个实现都通过符号扩展来处理这种情况,因此当整数值存储为二进制补码时,结果作为除以 2 的幂仍然有意义。

我手头没有引用资料,但 C89 实际上说了同样的话,并且 C 标准之前的惯例也符合这种解释。

关于php - 有人可以将它移植到 C 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com