Здравствуйте, ulong, Вы писали:
U>компилер "считает", что двойка может относиться к оператору <<.
Это-то понятно, как и способы борьбы. Просто подумал, вдруг это каким-то магическим образом дойдет до них, им стыдно станет и это исправят. К тому же лишние скобки — действительно лишние. :)
А вот тут молчит "почему-то":
template <typename T>
T n_hbits(const T& value, const size_t num_bits)
{
const size_t value_bits = BITSIZE(value);
if (0 == num_bits) { return 0; }
if (num_bits >= value_bits) { return value; }
return static_cast<T>( value & static_cast<T>( ~static_cast<T>(0) << static_cast<T>(value_bits - num_bits) ) );
}