大佬教程收集整理的这篇文章主要介绍了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 – 我应该如何在typedef中定义一组位数?全部内容,希望文章能够帮你解决c – 我应该如何在typedef中定义一组位数?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。