yohhoyの日記

技術的メモをしていきたい日記

C++標準ライブラリのビット処理関数群

C++2a(C++20)標準ライブラリに追加される <bit> ヘッダについてメモ。

// C++2a <bit>ヘッダ
namespace std {
  // sizeof(To) == sizeof(From)
  template<typename To, typename From>
    constexpr To bit_cast(const From& from) noexcept;

  // T = 符号なし整数型
  template <class T>
    constexpr bool ispow2(T x) noexcept;
  template <class T>
    constexpr T ceil2(T x) noexcept;
  template <class T>
    constexpr T floor2(T x) noexcept;
  template <class T>
    constexpr T log2p1(T x) noexcept;
}
関数 効果
bit_cast<To>(n) ビット表現を維持した型キャスト(安全なreinterpret_cast)
ispow2(n) nが"2の冪乗"か否かを判定
ceil2(n) n以上で最小の"2の冪乗"
floor2(n) n以下で最大の"2の冪乗"
log2p1(n) 1 + floor(log2(n))の整数演算*1

入力値nと関数戻り値(n=0..16):

n ispow2 ceil2 floor2 log2p1
0 false 1 0 0
1 true 1 1 1
2 true 2 2 2
3 false 4 2 2
4 true 4 4 3
5..7 false 8 4 3
8 true 8 8 4
9..15 false 16 8 4
16 true 16 16 5

関連URL

*1:初期提案P0556R0では“前提条件(Requires) n>0 あり log2(n)”と定義されていたが、C++標準ライブラリの広い契約(Wide Contracts)を満たす(→id:yohhoy:20180127)よう仕様変更された。