Namespaces
Variants

std:: bit_ceil

From cppreference.net
Utilities library
Definiert im Header <bit>
template < class T >
constexpr T bit_ceil ( T x ) ;
(seit C++20)

Berechnet die kleinste ganzzahlige Zweierpotenz, die nicht kleiner als x ist.

Wenn dieser Wert nicht in T darstellbar ist, ist das Verhalten undefiniert. Ein Aufruf dieser Funktion ist nur während der konstanten Auswertung zulässig, wenn das undefinierte Verhalten nicht auftritt.

Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn T ein vorzeichenloser Ganzzahltyp ist (also unsigned char , unsigned short , unsigned int , unsigned long , unsigned long long oder ein erweiterter vorzeichenloser Ganzzahltyp).

Inhaltsverzeichnis

Parameter

x - Wert des vorzeichenlosen Ganzzahltyps

Rückgabewert

Die kleinste ganzzahlige Zweierpotenz, die nicht kleiner ist als x .

Ausnahmen

Wirft nichts.

Hinweise

Vor P1956R1 war der vorgeschlagene Name für diese Funktionsvorlage ceil2 .

Feature-Test Makro Wert Std Funktion
__cpp_lib_int_pow2 202002L (C++20) Ganzzahlige Zweierpotenz- 2 Operationen

Mögliche Implementierung

Siehe mögliche Implementierungen in libstdc++ (gcc) und 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
    {   // für Typen, die Ganzzahl-Höherstufung unterliegen
        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);
    }
}

Beispiel

#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';
}

Ausgabe:

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

Siehe auch

(C++20)
findet die größte ganzzahlige Potenz von 2 die nicht größer als der gegebene Wert ist
(Funktions-Template)