【发布时间】:2013-03-09 16:08:45
【问题描述】:
我需要将k 计算为 2 的最小幂,即 >= 整数值 n(n 始终 > 0)
目前我正在使用:
#define log2(x) log(x)/log(2)
#define round(x) (int)(x+0.5)
k = round(pow(2,(ceil(log2(n)))));
这是一个性能关键的功能
有没有更高效的计算方式来计算k?
【问题讨论】:
-
如果你使用 GCC,你可以使用
1 << CHAR_BIT * sizeof x - __builtin_clz(x),前提是x的类型为unsigned int,或者,在普通系统上,int。unsigned long也有__builtin_clzl。一些非 GCC 编译器也支持这个扩展。这将比迄今为止在具有“查找第一位集”指令的处理器上的任何其他答案都快。 -
注意编辑从'>一个整数值'到'>=一个整数值'
-
现在每个人都必须再次更改他们的答案。 :-)
-
要求堆栈溢出“撤消”按钮...
-
与答案无关,但值得一提的是任何遇到此问题并且不知道更好的人:明智的做法是放弃 +0.5 和 (int) 演员,而是使用 floor() 或像这样的计算中的上限()函数。当然,对数仍然很慢。
标签: c performance math optimization