我想尽快执行以下操作

x / LSB(x)

其中x是在编译时未知的整数值,而LSB(x) = x & -x是。
(或者,该操作等于2除以2的乘方除以x的最大乘方。)我正在寻找一个合理的可移植解决方案(没有像GCC的__builtin_clz之类的编译器内在函数/内建函数)。

我担心的是以下简单的实现
x / (x & -x)

仍然会导致代价高昂的除法,因为编译器可能无法意识到除法实际上等于右移除数的尾数为零。

如果我的担忧是合理的,那么有什么更有效的方法来实现呢?

我希望能轻松扩展到32位,64位,128位等整数类型的解决方案。

最佳答案

怎么样

x >>= ffs(x)-1;
ffs函数符合4.3BSD POSIX.1-2001。

如果x为0,则无法使用。

07-24 09:52
查看更多