Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как используя побитовые операции найти максимальное значение данного типа?

#cpp #битовые_операции


Как используя побитовые операции найти максимальное значение данного типа? Например:
std::uint8_t, std::uint16_t, std::uint32_t, std::uint64_t.
    


Ответы

Ответ 1



Например, можно проинвертировать 0 для соответствующего типа uint64_t ret = ~uint64_t(0); uint32_t ret2 = ~uint32_t(0); Но это работает только для беззнаковых типов (про знаковые, как я понимаю, речь не идет).

Ответ 2



Для типов с фиксированной шириной (унаследовано из Си) определено побитовое представление (которое на практике и для других целых типов используется). В этом представлении (определив bitwise_limits<> класс по аналогии со std::numeric_limits<>): у наибольшего числа без знака все биты выставлены (no padding bits) static constexpr T max() noexcept { return ~T(0); } // all bits set у наименьшего числа без знака все биты нулевые (не выставлены) static constexpr T min() noexcept { return T(0); } // all bits clear у наибольшего числа со знаком выставлены все биты, за исключением бита под сам знак static constexpr T max() noexcept { // all bits set except sign return bitwise_limits>::max() >> 1; } у наименьшего числа со знаком все биты не выставлены за исключением знака (дополнительный код) static constexpr T min() noexcept { return ~max(); // all bits clear except sign } Пример: int main() { std::cout << (int)bitwise_limits::max() << '\n'; std::cout << (int)bitwise_limits::min() << '\n'; std::cout << (int)bitwise_limits< int8_t>::max() << '\n'; std::cout << (int)bitwise_limits< int8_t>::min() << '\n'; } Результат 255 0 127 -128

Ответ 3



Они все беззнаковые, так что фактически это значение -1, приведенное к данному типу - type(-1) Можно и сдвигами, хотя это медленнее - просто считать, после какого сдвига перестанет расти - что-то типа unsigned int x = 1; for(;;) { unsigned int y = (x << 1) + 1; if (x == y) break; x = y; } printf("%lx\n",x); P.S. Совет сдвинуть на sizeof(type)*8 бит и вычесть 1 - это, собственно, мой первый совет, так как 1<

Комментариев нет:

Отправить комментарий