Espacios de nombres
Variantes

std::bit_ceil

De cppreference.com
 
 
 
<tbody> </tbody>
Definido en el archivo de encabezado <bit>
template< class T > constexpr T bit_ceil( T x );
(desde C++20)

Calcula la potencia entera más pequeña de dos que no sea menor que x.

Si ese valor no se puede representar en T, el comportamiento no está definido. La llamada a esta función está permitida en la evaluación constante solo si no se produce el comportamiento no definido.

Esta sobrecarga solo participa en la resolución de sobrecargas si T es un tipo entero sin signo (es decir, unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, o un tipo entero sin signo extendido).

Parámetros

x - Valor del tipo entero sin signo.

Valor de retorno

La potencia entera más pequeña de dos que no sea menor que x.

Excepciones

No lanza nada.

Notas

Macro de Prueba de característica
__cpp_lib_int_pow2

Posible implementación

Véanse posibles implementaciones en libstdc++ (gcc) y libc++ (clang)

template <std::unsigned_integral T>
    requires !std::same_as<T, bool> && !std::same_as<T, char> &&
             !std::same_as<T, char8_t> && !std::same_as<T, char16_t> &&
             !std::same_as<T, char32_t> && !std::same_as<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 { // para tipos sujetos a promoción de enteros
        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);
    }
}

Ejemplo

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

auto main() -> signed int // :()
{
    using bin = std::bitset<8>;

    for (unsigned x{0}; x != 10; ++x)
    {
        unsigned const z = std::bit_ceil(x); // `ceil2` antes de P1956R1

        std::cout << "bit_ceil( " << bin(x) << " ) = " << bin(z) << '\n';
    }
}

Salida:

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

Véase también

(C++20)
Encuentra la potencia a dos más grande que no es mayor que el valor dado
(plantilla de función) [editar]