相关疑难解决方法(0)

120
推荐指数
7
解决办法
22万
查看次数

如何在C中实现算术右移

在信号处理许多无损算法需要的形式⌊的表达的评估  一个  / 2 b  ⌋,其中一个,b是签名(一个可能为负,b非负)的整数和⌊·⌋是地板函数.这通常会导致以下实施.

int floor_div_pow2(int numerator, int log2_denominator)
{
    return numerator >> log2_denominator;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,C标准规定>>如果左操作数具有有符号类型和负值,则运算符的结果是实现定义的.

为了确保所有平台上的正确行为,可以用多个if-else条件替换这个简单的函数,从而导致程序性能不佳.(必须有人来治疗的整数溢出和考虑的情况下,当numeratorINT_MIN.)

因此,我想问一下,在C中实现算术右移的最佳实践是什么?理想情况下,我正在寻找与上面的代码片段编译成相同代码1的构造,同时避免实现定义的行为.

1考虑例如gcc和x86-64平台

更新:

经过一番思考,我意识到我在上面的问题中做了不正确的暗示.如果平台不使用二进制补码,则使用算术移位计算负数的基函数是没有意义的.我们的目标是实现表达⌊  一个  / 2 b  ⌋在便携式方式.

c bit-manipulation bit-shift integer-arithmetic signed-integer

6
推荐指数
1
解决办法
1827
查看次数