我想尽快执行以下操作
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,则无法使用。