Namespaces
Variants

std::shl

Depuis 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 (déprécié en C++20)
 
 
Défini dans l'en-tête <bit>
template< class T, class S >
constexpr T shl( T x, S s ) noexcept;
(depuis C++29)

Renvoie ⌊x · 2s
⌋
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 · 2s
⌋
tronqué au type de résultat.

Notes

Contrairement à l'opérateur <<, std::shl n'a jamais de comportement indéfini. Le décalage s'effectue comme s'il s'agissait d'un décalage à gauche d'un seul bit s fois, ou d'un décalage à droite d'un seul bit -s fois si s est négatif, sauf que -s ne peut pas déborder.

Macro de 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 shl(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(x < 0 ? -1 : 0) : x >> -s;
    }
    return s >= width ? T(0) : x << s;
}

Exemple

Voir aussi

(C++29)
décale vers la droite sans possibilité de comportement indéfini
(modèle de fonction)
(C++20)
calcule le résultat d'une rotation binaire vers la gauche
(modèle de fonction)
(C++20)
calcule le résultat d'une rotation binaire vers la droite
(modèle de fonction)