在编译时生成位掩码

Jac*_*cko 4 c++ bit-manipulation constexpr

我想在编译时生成各种位掩码:

0x11111111或者0x1111111111111111

0xF0F0F0F0或者0xF0F0F0F0F0F0F0F0

大小取决于类型,是 32 位还是 64 位。

前任:

template <typename T> genMask(unsigned char templt) {
  ....
};

genMask<uint32_t>(0xF0);
genMask<uint64_t>(0xF0);
Run Code Online (Sandbox Code Playgroud)

第一次调用应该生成0xF0F0F0F0,而第二次调用 genMask 应该生成0xF0F0F0F0F0F0F0F0

目前我已经对这些进行了硬编码。

这里的任何想法将不胜感激。

编辑:这是一种老式的做法:

#define MASK(b) ((T(-1) / 0xFF) * (b))

其中 T 是类型。

Pat*_*rts 6

使用,您可以通过以下方式完成此操作std::bit_cast

template <std::unsigned_integral T>
constexpr T genMask(unsigned char templt) {
  std::array<unsigned char, sizeof(T)> mask;
  mask.fill(templt);
  return std::bit_cast<T>(mask);
}
Run Code Online (Sandbox Code Playgroud)

如果你想确保这个函数只能返回编译时常量,你可以使用consteval说明符来代替,但通过在constexpr变量的初始化程序中调用上面的函数或作为非类型模板来达到相同的效果就足够了范围