std::shl
ja.cppreference.net より
| ヘッダ <bit>
|
||
template< class T, class S >
constexpr T shl( T x, S s ) noexcept;
|
(C++29 から) で定義 | |
戻り値は ⌊x · 2s
⌋ を負の無限大方向に丸め、T に収まるように切り詰めたものです。
引數
| x | - | 符号なし整数型の値 |
| s | - | シフトする位置の數 |
戻り値
⌊x · 2s
⌋ を結果の型に切り詰めたもの。
ノート
<< 演算子とは異なり、std::shl は未定義動作を引き起こすことはありません。
シフトは、1 ビット左シフトを s 回行うか、-s が負の場合は 1 ビット右シフトを s 回行うかのように行われます。ただし、-s はオーバーフローしません。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_bitops |
202606L |
(C++29) | より良いシフト |
実装例
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;
}
|
例
| このセクションは不完全です 理由: 例がありません |
関連項目
(C++29) |
未定義動作の可能性なく右シフトを行う (関数テンプレート) |
(C++20) |
ビット単位の左ローテートの結果を計算する (関数テンプレート) |
(C++20) |
ビット単位の右ローテートの結果を計算する (関数テンプレート) |