Namespaces
Variants

std::shr

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
 
Défini dans l'en-tête <bit>
template< class T, class S >
constexpr T shr( T x, S s ) noexcept;
(depuis C++29)

Renvoie ⌊x · 2-s
⌋
arrondi vers moins l'infini, et tronqué pour tenir dans T.

Paramètres

x - valeur d'un type entier non signé
s - nombre de positions à décaler

Valeur de retour

⌊x · 2-s
⌋
tronqué au type de résultat.

Notes

Contrairement à l'opérateur >>, std::shr n'a jamais de comportement indéfini. Le décalage s'effectue comme si on décalait d'un bit vers la droite s fois, ou en décalant d'un bit vers la gauche -s fois si s est négatif, sauf que -s ne peut pas déborder.

Test de fonctionnalité macro Valeur Norme Fonctionnalité
__cpp_lib_bitops 202606L (C++29) Meilleur décalage

Implémentation possible

template<class T, class S> // TODO: constraints
constexpr T shr(T x, S s) noexcept
{
    constexpr auto width = S(std::numeric_limits<std::make_unsigned_t<T>>::digits);
    if constexpr (std::is_signed_v<S>)
    {
        if (s < 0)
            return s <= -width ? T(0) : x << -s;
    }
    return s >= width ? T(x < 0 ? -1 : 0) : x >> s;
}

Exemple

Voir aussi

(C++29)
décale à gauche sans possibilité de comportement indéfini
(gabarit de fonction)
(C++20)
calcule le résultat d'une rotation à gauche sur les bits
(gabarit de fonction)
(C++20)
calcule le résultat d'une rotation à droite sur les bits
(gabarit de fonction)