<分区>
我需要计算 2 的最大幂 < 整数值 x
目前我正在使用:
#define log2(x) log(x)/log(2)
#define round(x) (int)(x+0.5)
x = round(pow(2,(ceil(log2(n))-1)));
这是一个性能关键函数
是否有计算 x 的计算效率更高的方法?
<分区>
我需要计算 2 的最大幂 < 整数值 x
目前我正在使用:
#define log2(x) log(x)/log(2)
#define round(x) (int)(x+0.5)
x = round(pow(2,(ceil(log2(n))-1)));
这是一个性能关键函数
是否有计算 x 的计算效率更高的方法?
最佳答案
您实际上是在寻找数字中最高的非零位。许多处理器为此内置了指令,而这些指令又被许多编译器公开。例如,在 GCC 中我会查看 __builtin_clz
, 哪个
Returns the number of leading 0-bits in
x
, starting at the most significant bit position.
连同 sizeof(int) * CHAR_BIT
和一个移位,您可以使用它来计算相应的纯二次幂整数。还有一个用于长整数的版本。
(CPU 指令可能称为“CLZ”(计算前导零),以防您需要为其他编译器查找它。)
关于c - 2 < x 的最大幂的高效计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16001683/