//----------------------------------------------------------------------------//
/// Clipping unsigned minus
///
template <class T>
T cu_minus(T a, T b)
{
T r = a - b;
if (r>a) return 0;
return r;
}
uint32_t lowerBits(unsigned n)
{
unsigned shift = cu_minus(32u, n);
uint32_t r = uint32_t(0xFFFFFFFFu) >> shift;
return r;
}
Почему lowerBits(0) равен 4294967295?
Функцию «clipping unsigned minus» привёл только для полноты, в ней ошибки нет (максимум поведение, определяемое реализацией, и меня это устраивает). Что необычного в сдвигах?
А с этой версией, надеюсь, всё в порядке?
uint32_t lowerBits(unsigned n)
{
if (n >= 32)
return 0xFFFFFFFFu;
return uint32_t(0x7FFFFFFF) >> (31u - n);
}