Я попытался написать функцию, которая возвращает целое число только с самым старшим битом входного набора, используя constexpr C ++ 0x.
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));
}
Это дает сбой во время компиляции с использованием gcc4.6.1.
error: expression ‘(p <unknown operator> ((p >> 1) | p))’ is not a constant-expression
Обратите внимание, что это работает без ключевого слова constexpr.
Мои вопросы:
Почему это не работает?Я вижу, что operator | = не является constexpr, но имеет ли это значение для встроенных типов?
Есть ли простой способ написать эту функцию как constexpr?Я хотел бы, чтобы он был достаточно эффективным во время выполнения, и я немного беспокоюсь о читабельности.