- bit[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp29[meta cpp]
namespace std {
template <class T>
constexpr T bit_expand(T x, T m) noexcept; // C++29
}xの下位ビットを、マスクmでビットが立っている位置へ順に配置する(parallel bits deposit)。
x86のPDEP命令に相当する操作であり、bit_compressの逆操作である。
- 型
Tが符号なし整数型であること
Tのビット数をNとする。mの第nビットが1である位置を下位から順に走査し、xの下位ビットから順に取り出した値をその位置へ配置した値を返す。すなわち、mのなかでk番目に立っているビット位置には、xの第kビットが配置される。
投げない
bit_compressは逆操作である。mのビットがすべて1のとき、bit_expand(bit_compress(x, m), m)はxに等しい。
#include <bit>
#include <cstdint>
#include <print>
int main()
{
std::uint8_t x = 0b0000'1011;
std::uint8_t m = 0b1111'0000; // 下位4ビットを上位4ビットの位置へ展開
std::uint8_t r = std::bit_expand(x, m);
std::println("{:08b}", r);
}- std::bit_expand[color ff0000]
10110000
- C++29
- Clang: 22 [mark noimpl]
- GCC: 16.1 [mark noimpl]
- Visual C++: 2026 Update 2 [mark noimpl]
- P3104R3 Bit permutations
- C++29で追加された