Szewczyk
@Szewczyk

Как получить наименьший целочисленный тип, способный вместить число n?

Привет, мне нужен массив чисел, которые будут точно не больше переменой n, в моем случае это размер определенного вектора. Как мне получить наименьший такой тип? Наример вектор имеет размер 10, но хранится он в uint64_t, что достаточно дорого выходит.

Нашел такое решение, но оно не работает в моем случае (наверное потому что мое число не constexpr)
template<unsigned long long Max>
struct RequiredBits
{
    enum {
        value =
        Max <= 0xff ? 8 :
        Max <= 0xffff ? 16 :
        Max <= 0xffffffff ? 32 :
        64
    };
};

template<int bits> struct SelectInteger_;
template<> struct SelectInteger_ <8> { typedef uint8_t type; };
template<> struct SelectInteger_<16> { typedef uint16_t type; };
template<> struct SelectInteger_<32> { typedef uint32_t type; };
template<> struct SelectInteger_<64> { typedef uint64_t type; };

template<unsigned long long Max>
struct SelectInteger : SelectInteger_<RequiredBits<Max>::value> {};
  • Вопрос задан
  • 265 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Я бы тоже посоветовал выделить массив байт, и кастовать указатель к нужному типу, скажем, через union.
Если alignment массива будет подходящий (например, сразу по 8 байтам), то никакого замедления быть не должно в итоге.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы