Namespaces
Variants

std::bit_repeat

Von de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (grundlegende Typen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Koroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Dreiveg-Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationale Operatoren (veraltet in C++20)
Integer-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Allgemeine Vokabeltypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Bitmanipulation
(C++20)
(C++23)
Ganzzahlige Potenzen von 2
(C++20)
(C++20)
(C++20)
Schieben
(C++29)
(C++29)
Rotieren
(C++20)
(C++20)
Zählen
(C++20)
(C++20)
(C++20)
Permutation
(C++29)
(C++29)
Endian
(C++20)
 
Definiert in Header <bit>
template< class T >
constexpr T bit_repeat( T x, int l );
(seit C++29)

Wiederholt das Bitmuster in x der Länge l so oft, wie in das Ergebnis passt (wobei die letzte Wiederholung möglicherweise abgeschnitten wird).

Wenn l kleiner oder gleich 0 ist, ist das Verhalten undefiniert. Der Aufruf dieser Funktion ist in konstanter Auswertung nur erlaubt, wenn das undefinierte Verhalten nicht auftritt.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein vorzeichenloser Integer-Typ ist (das heißt, unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long oder ein erweiterter vorzeichenloser Integer-Typ).

Parameter

x - Wert eines vorzeichenlosen Integer-Typs

Rückgabewert

Das wiederholte Bitmuster.

Ausnahmen

Wirft nichts.

Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_bitops 202606L (C++29) Bit-Permutationen

Mögliche Implementierung

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

// This is a valid, but highly inefficient version of bit_repeat.
template<std::unsigned_integral T>
    requires neither<T, bool, char, char8_t, char16_t, char32_t, wchar_t>
constexpr T bit_repeat_naive(T x, int l) noexcept
{
    T result = 0;
    for (int i = 0; i != std::numeric_limits<T>::digits; ++i)
        result |= ((x >> (i % length)) & 1) << i;
    return result;
}

// Constant-time implementation (preferred).
template<std::unsigned_integral T>
    requires neither<T, bool, char, char8_t, char16_t, char32_t, wchar_t>
constexpr T bit_repeat(T x, int l) noexcept
{
    static constexpr auto lookup = []
    {
        std::array<T, std::numeric_limits<T>::digits> result{};
        for (std::size_t i = 1; i != result.size(); ++i)
            result[i] = bit_repeat_naive(one, l);
        return result;
    }();
    if (l >= std::numeric_limits<T>::digits)
        return x;
    T mask = (T{1} << l) - T{1};
    return lookup[l] * (mask & x);
}

Beispiel

#include <bit>
#include <cstdint>

static_assert(
    std::bit_repeat(
        std::uint8_t{1}, 1) ==
        std::uint8_t{0b1111'1111} and
    std::bit_repeat(
        std::uint8_t{0b1110}, 2) ==
        std::uint8_t{0b1010'1010} and
    std::bit_repeat(
        std::uint8_t{0b101}, 3) ==
        std::uint8_t{0b1'101'101} and
    std::bit_repeat(
        std::uint16_t{0b1100}, 4) ==
        std::uint16_t{0b1100'1100'1100'1100}
);

int main() {}

Siehe auch

kehrt die Bits in einer ganzen Zahl um
(Funktionstemplate)
komprimiert Bits eines Operanden unter Verwendung einer Maske (PEXT)
(Funktionstemplate)
expandiert Bits aus einem Operanden unter Verwendung einer Maske (PDEP)
(Funktionstemplate)