我想在编译时生成各种位掩码:0x11111111
或0x1111111111111111
0xF0F0F0F0
或0xF0F0F0F0F0F0F0F0
大小取决于类型,32位或64位。
例如:
template <typename T> genMask(unsigned char templt) {
....
};
genMask<uint32_t>(0xF0);
genMask<uint64_t>(0xF0);
第一次调用应该生成0xF0F0F0F0
,而第二次调用genMask应该生成0xF0F0F0F0F0F0F0F0
目前我有这些硬编码。
任何想法在这里将不胜感激。
编辑:这是一个老派的方法:#define MASK(b) ((T(-1) / 0xFF) * (b))
其中T是类型。
3条答案
按热度按时间ohtdti5x1#
使用c++20,您可以使用
std::bit_cast
完成此操作:如果你想确保这个函数只返回编译时常量,你可以使用
consteval
specifier,但是通过在constexpr
变量的初始化器中调用上面的函数,或者作为一个非类型的模板参数,就足以达到同样的效果。uhry853o2#
一种方法是构建一个所需字节数组,然后使用
std::bit_cast
将这些位强制转换为目标类型。其输出
如果你不能使用
std::bit_cast
,那么你可以自己做位操作,比如ltskdhd13#
因此,您需要将1字节模式乘以
0x01010101...
(重复以获得适当的类型长度)。你会注意到,如果你的模式是
0xFF
,那么你最终会得到0xFFFFFFFF...
,或者该类型的最大值,所以除以0xFF
将得到0x01
的模式。他说: