std::bit_ceil
From cppreference.com
| ヘッダ <bit> で定義 |
||
| template< class T > constexpr T bit_ceil( T x ); |
(C++20以降) | |
x より小さくない最小の2の累乗を計算します。
その値が T で表現できない場合、動作は未定義です。この関数の呼び出しは、未定義の動作が発生しない場合に限り、定数評価で許可されます。
このオーバーロードは、T が符号なし整数型(すなわち、unsigned char、unsigned short、unsigned int、unsigned long、unsigned long long、または拡張符号なし整数型)である場合にのみ、オーバーロード解決に参加します。
目次 |
[編集] パラメーター
| x | - | 符号なし整数型の値 |
[編集] 戻り値
x より小さくない最小の2の累乗。
[編集] 例外
何もスローしません。
[編集] 備考
P1956R1 以前は、この関数テンプレートの提案された名前は ceil2 でした。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_int_pow2 |
202002L |
(C++20) | 2の整数乗操作 |
[編集] 可能な実装
libstdc++ (gcc) および libc++ (clang) で可能な実装を参照してください。
template<std::unsigned_integral T> requires !std::same_as<T, bool> && !std::same_as<T, char> && !std::same_as<T, char8_t> && !std::same_as<T, char16_t> && !std::same_as<T, char32_t> && !std::same_as<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 { // for types subject to integral promotion 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); } } |
[編集] 例
このコードを実行
#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'; }
出力
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
[編集] 関連項目
| (C++20) |
与えられた値以下の最大の2の整数乗を求める (関数テンプレート) |