Namespaces
Variants

std::bit_ceil

Von de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationale Operatoren (veraltet in C++20)
Ganzzahlvergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Tauschen und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gemeinsame Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Definiert in 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.

Falls dieser Wert in T nicht darstellbar ist, ist das Verhalten undefiniert. Ein Aufruf dieser Funktion ist in konstanter Auswertung nur gestattet, wenn das undefinierte Verhalten nicht auftritt.

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

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)