我应该如何在 typedef 中定义一组位数?
How should I define a set number of bits in a typedef?
问题
我目前正在尝试用 C++11 模拟一些固件。在固件中,我们有一个固定的 32 位数据长度,我们将这 32 位分成更小的数据包,例如,我们有一个大小为 9 位的数据包,另一个 6 位的数据包被打包到 32 位字中。
在 C++ 中,我想确保我输入的数据具有这些长度。我不在乎我是否溢出,只是这9位被操作或传递给另一个函数。
理想情况下,我想要一些简单的 typedef,例如:
only_18_bits some_value;
我的尝试
struct sel_vals{
int_fast32_t m_val : 18;
int_fast8_t c_val : 5;
}
但这有点烦人,因为每当我想使用它时都必须这样做:
sel_vals somevals;
somevals.m_val = 5;
对我来说似乎有点冗长而且我必须先声明结构。
同样出于显而易见的原因,我不能只做类似的事情:
typedef sel_vals.m_val sel_vals_m_t;
typedef std::vector<sel_vals_m_t>;
我可以使用 std::bitset<9>
但每当我想做一些数学运算时,我必须将它转换为无符号的,这会变得有点混乱。我想避免混乱。
有什么想法吗?
我建议使用包装外观,大致如下:
#include <cstdint>
template<int nbits> class bits {
uint64_t value;
static const uint64_t mask = (~(uint64_t)0) >> (64-nbits);
public:
bits(uint64_t initValue=0) : value(initValue & mask) {}
bits &operator=(uint64_t newValue)
{
value=newValue & mask;
}
operator uint64_t() const { return value; }
};
//
bits<19> only_19_bits_of_precision;
通过一些工作,您可以定义直接在这些模板上运行的数学运算符重载。
再多做一点工作,您可以使用此模板来选择较小的内部值,uint32_t
、uint16_t
或 uint8_t
,如果 nbits
模板参数够小
问题
我目前正在尝试用 C++11 模拟一些固件。在固件中,我们有一个固定的 32 位数据长度,我们将这 32 位分成更小的数据包,例如,我们有一个大小为 9 位的数据包,另一个 6 位的数据包被打包到 32 位字中。
在 C++ 中,我想确保我输入的数据具有这些长度。我不在乎我是否溢出,只是这9位被操作或传递给另一个函数。
理想情况下,我想要一些简单的 typedef,例如:
only_18_bits some_value;
我的尝试
struct sel_vals{
int_fast32_t m_val : 18;
int_fast8_t c_val : 5;
}
但这有点烦人,因为每当我想使用它时都必须这样做:
sel_vals somevals;
somevals.m_val = 5;
对我来说似乎有点冗长而且我必须先声明结构。
同样出于显而易见的原因,我不能只做类似的事情:
typedef sel_vals.m_val sel_vals_m_t;
typedef std::vector<sel_vals_m_t>;
我可以使用 std::bitset<9>
但每当我想做一些数学运算时,我必须将它转换为无符号的,这会变得有点混乱。我想避免混乱。
有什么想法吗?
我建议使用包装外观,大致如下:
#include <cstdint>
template<int nbits> class bits {
uint64_t value;
static const uint64_t mask = (~(uint64_t)0) >> (64-nbits);
public:
bits(uint64_t initValue=0) : value(initValue & mask) {}
bits &operator=(uint64_t newValue)
{
value=newValue & mask;
}
operator uint64_t() const { return value; }
};
//
bits<19> only_19_bits_of_precision;
通过一些工作,您可以定义直接在这些模板上运行的数学运算符重载。
再多做一点工作,您可以使用此模板来选择较小的内部值,uint32_t
、uint16_t
或 uint8_t
,如果 nbits
模板参数够小