c – 我应该如何在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;

通过一些工作,您可以定义直接对这些模板进行操作的数学运算符重载.

如果nbits模板参数足够小,您可以使用此模板选择较小的内部值uint32_t,uint16_t或uint8_t.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...