右移(除法)-> 向零舍入

Rea*_*ude 2 c bit-manipulation

我正在做这个..

value >> 3;
Run Code Online (Sandbox Code Playgroud)

它总是朝着负数方向发展。如何用右移除法向零舍入?

Ale*_*ros 6

天哪,答案很糟糕;你想在不分支的情况下解决这个问题,但也不破坏你的正数。

这里是 :

(int)(value+(((unsigned)value)>>31)) >> 3
Run Code Online (Sandbox Code Playgroud)

需要强制转换为 (unsigned) 来执行逻辑移位并仅获取符号位,然后我们需要强制转换回 (int) 来执行算术右移。

上面的代码假设您的 int 数据类型是 32 位,在这种情况下您当然应该使用 int32_t 等数据类型。

  • 更正!对于除以 8(或移位 3),您实际上需要添加 7 倍的符号位(或分子 - 1);不是像上面的例子那样一次,它适用于移位 1 (或除以 2 )。因此,换句话说,类似于: uint32_t signbit=((uint32_t)value)>>31; 结果 = ((int32_t)(值+(signbit<<shift)-signbit))>>shift; (2认同)