Spec-Zone.ru › C++

std::bit_ceil

Определён в заголовочном файле <bit>
template< class T >
constexpr T bit_ceil( T x );
(начиная с C++20)

Вычисляет наименьшую целую степень двойки, не меньшую, чем x.

Если это значение не представимо в T, поведение не определено. Вызов этой функции допускается при вычислении константного выражения, только если неопределённое поведение не возникает.

Эта перегрузка участвует в разрешении перегрузки только в том случае, если T является беззнаковым целочисленным типом (то есть unsignedchar, unsignedshort, unsignedint, unsignedlong, unsignedlonglong или расширенным беззнаковым целочисленным типом).

Параметры

x - значение беззнакового целочисленного типа

Возвращаемое значение

Наименьшая целая степень двойки, не меньшая, чем x.

Исключения

Не выбрасывает исключений.

Примечания

До выхода P1956R1 предложенным именем этого шаблона функции было ceil2.

Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_int_pow2 202002L (C++20) Операции с целыми степенями двойки

Возможная реализация

См. возможные реализации в libstdc++ (gcc) и libc++ (clang).

template<typename T, typename ... U>
concept neither = (!std::same_as<T, U> && ...);

template<std::unsigned_integral T>
    requires neither<T, bool, char, char8_t, char16_t, char32_t, wchar_t>
constexpr T bit_ceil(T x) noexcept
{
    if (x <= 1u)
        return T(1);
    if constexpr (std::same_as<T, decltype(+x)>)
        return T(1) << std::bit_width(T(x - 1));
    else
    {   // for types subject to integral promotion
        constexpr int offset_for_ub =
            std::numeric_limits<unsigned>::digits - std::numeric_limits<T>::digits;
        return T(1u << (std::bit_width(T(x - 1)) + offset_for_ub) >> offset_for_ub);
    }
}

Пример

#include <bit>
#include <bitset>
#include <iostream>

int main()
{
    using bin = std::bitset<8>;
    for (auto x{0U}; 0XA != x; ++x)
        std::cout << "bit_ceil( " << bin(x) << " ) = "
                  << bin(std::bit_ceil(x)) << '\n';
}

Вывод:

bit_ceil( 00000000 ) = 00000001
bit_ceil( 00000001 ) = 00000001
bit_ceil( 00000010 ) = 00000010
bit_ceil( 00000011 ) = 00000100
bit_ceil( 00000100 ) = 00000100
bit_ceil( 00000101 ) = 00001000
bit_ceil( 00000110 ) = 00001000
bit_ceil( 00000111 ) = 00001000
bit_ceil( 00001000 ) = 00001000
bit_ceil( 00001001 ) = 00010000

См. также

bit_floor
(C++20)
находит наибольшую целую степень двойки, не превышающую заданное значение
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/bit_ceil

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API