C ++ 11
我试着编写一个函数,它使用C ++ 0x constexpr返回一个只有输入集合中最高位的整数。
constexpr inline uint64_t
get_highest_bit(uint64_t p)
{
return
(p|=(p>>1)),
(p|=(p>>2)),
(p|=(p>>4)),
(p|=(p>>8)),
(p|=(p>>16)),
(p|=(p>>32)),
(p-(p>>1));
}
这给使用gcc 4.6.1编译时失败。
error: expression ‘(p <unknown operator> ((p >> 1) | p))’ is not a constant-expression
请注意,它没有constexpr关键字。
我的问题是:
为什么这不起作用? 我可以看到运算符| =不是一个constexpr,但它对于内置类型很重要吗?
有没有一种简单的方法来编写这个函数作为constexpr? 我希望它在运行时能够合理高效,并且我关心可读性。
(未在GCC上测试,因为我没有4.6,但我已经验证了算法是正确的。)
要使用constexpr
你不能有任务。 因此,您经常需要用递归函数形式编写:
#include <cstdint>
#include <climits>
constexpr inline uint64_t highestBit(uint64_t p, int n = 1) {
return n < sizeof(p)*CHAR_BIT ? highestBit(p | p >> n, n * 2) : p - (p >> 1);
}
int main() {
static_assert(highestBit(7) == 4);
static_assert(highestBit(5) == 4);
static_assert(highestBit(0x381283) == 0x200000);
return 0;
}
你可以检查C ++ 0x§[expr.const] / 2来查看哪些表达式不能用在constexpr
函数中。 具体而言,倒数第二项是“赋值或复合赋值”。
constexpr inline uint64_t highestBit(uint64_t p)
{
return (p & (p-1))? highestBit(p & (p-1)): p;
}
递归的每一级都会清除已设置的最右边的位,当最后一位被清除时,只剩下最高位,所以它被返回。
链接地址: http://www.djcxy.com/p/68359.html上一篇: c++11
下一篇: How to do community detection in a edge weighted network/graph?