std::bit_expand
ja.cppreference.net より
| ヘッダ <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() {}
関連項目
(C++29) |
マスクを使用してオペランドのビットを圧縮する (PEXT) (関数テンプレート) |