c – 迭代一个位域的成员

c – 迭代一个位域的成员,第1张

概述我们有这个例子: struct X { int e0 : 6; int e1 : 6; int e2 : 6; ... int e10 : 6;};struct X c; 如何“自动”访问成员,类似于: c.e {0-10}? 如果我想读c.e0,那么c.e1 … 如果我的结构有1000个元素,我不认为我应该编写这么多代码,对吧? 你能帮我解决一个问题吗? 我提到我已经阅 我们有这个例子:

struct X {  int e0 : 6;  int e1 : 6;  int e2 : 6;  ...  int e10 : 6;};struct X c;

如何“自动”访问成员,类似于:
c.e {0-10}?
如果我想读c.e0,那么c.e1 …
如果我的结构有1000个元素,我不认为我应该编写这么多代码,对吧?

你能帮我解决一个问题吗?
我提到我已经阅读了与此问题有关的其他帖子,但我没有找到解决方案.

非常感谢你 !

解决方法 正如其他人所说,你不能用比特字段做你想要的.看起来你想要存储大量的6位整数,以最大的空间效率.我不会争论这是不是一个好主意.相反,我将使用C功能进行封装(未经测试),呈现一种老式的C方式.这个想法是4个6位整数需要24位或3个字符.

// In each group of 3 chars store 4 6 bit intsconst int nbr_elements = 1000;struct X{    // 1,2,3 or 4 elements require 3 chars,5,6,7,8 require 6 chars etc.    char[ 3*((nbr_elements-1)/4) + 3 ] storage;    int get( int IDx );};int X::get( int IDx ){    int dat;    int offset = 3*(IDx/4);      // eg IDx=0,1,3 -> 0 IDx=4,7 -> 3 etc.    char a = storage[offset++];    char b = storage[offset++];    char c = storage[offset];    switch( IDx%4)  // bits lIE like this; 00000011:11112222:22333333    {        case 0: dat = (a>>2)&0x3f;                    break;        case 1: dat = ((a<<4)&0x30) + ((b>>4)&0x0f);  break;        case 2: dat = ((b<<2)&0x3c) + ((c>>6)&0x03);  break;        case 3: dat = c&0x3f;                         break;    }       return dat;}

我将伴侣put()函数作为练习.

总结

以上是内存溢出为你收集整理的c – 迭代一个位域的成员全部内容,希望文章能够帮你解决c – 迭代一个位域的成员所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1220434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存