Namespaces
Variants

std::bit_expand

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型, RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20 で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
ビット操作
(C++20)
(C++23)
2 の整数乗2
(C++20)
(C++20)
(C++20)
シフト
(C++29)
(C++29)
回転
(C++20)
(C++20)
カウント
(C++20)
(C++20)
(C++20)
置換
(C++29)
(C++29)
エンディアン
(C++20)
 
ヘッダ <bit>
template< class T >
constexpr T bit_expand( T x, T m ) noexcept;
で定義 (C++29 以降)

x の最下位ビットを選択し、m が 1 ビットを持っている位置に配置します。残りのビットは 0 になります。

このオーバーロードは、T が符号なし整数型(すなわち unsigned char、unsigned short、unsigned int、unsigned long、unsigned long long、または拡張符号なし整数型)である場合にのみオーバーロード解決に参加します。

引数

x - 符号なし整数型の値
m - 符号なし整数型の値

戻り値

x マスク m を介してビットを埋め込んだ結果。

注釈

この関数は、PDEP x86_64 および PDEP ARM 命令と同じ結果を生成します。

機能テスト マクロ 値 標準 機能
__cpp_lib_bitops 202606L (C++29) ビット置換

実装例

template<typename T, typename ... U>
concept neither = (!std::same_as<T, U> && ...);

template<std::unsigned_integral T>
    requires neither<T, bool, char, char8_t, char16_t, char32_t, wchar_t>
constexpr T bit_compress(T x) noexcept
{
    T result = 0;
    for (int i = 0, j = 0; i < std::numeric_limits<T>::digits; ++i)
    {
        bool mask_bit = (m >> i) & 1;
        result |= (mask_bit & (x >> j)) << i;
        j += mask_bit;
    }
    return result;
}

例

#include <bit>
#include <cstdint>

static_assert(
    std::bit_expand(
        std::uint16_t{0xABCD}, // source
        std::uint16_t{0x0F0F}) // mask
    ==  std::uint16_t{0x0C0D}  // result
);
static_assert(
    std::bit_expand(
        std::uint8_t{0b1010'1001}, // source
        std::uint8_t{0b0011'0011}) // mask
    ==  std::uint8_t{0b0010'0001}  // result
);

int main() {}

関連項目

マスクを使用してオペランドのビットを圧縮する (PEXT)
(関数テンプレート)