首页 \ 问答 \ 位字段并集的大小,其成员数多于其大小(Size of bit-field union which has more members than its size)

位字段并集的大小,其成员数多于其大小(Size of bit-field union which has more members than its size)

#include <stdio.h>

union mix {
  unsigned char a1:1;  
  unsigned char a2:4;
  unsigned char a3:4;    
  unsigned char a4:1;  
  unsigned char a5:4;
  unsigned char a6:4;    
  unsigned char a7:1;  
  unsigned char a8:4;
  unsigned char a9:4;    
  unsigned char a10:1;  
  unsigned char a11:4;
  unsigned char a12:4;       
};

int main() {

    printf("Sizeof mix = %d bytes\n", sizeof(union mix));

    return 0;
}

输出为1个字节

超过8位的位域成员会发生什么? 显然,我仍然可以为任何位字段成员设置并获取正确的值。

UPDATE

谢谢你清除我的困惑。 一个问题:这些位以什么顺序存储在内存中? 假设它是小端存储器,那么0xabcd将作为0xd,0xc,0xb,0xa存储在存储器中。

  1. m.a1会成为0xd OR oxa的一部分吗?
  2. 它是0xd(或0xa)的第3位还是第0位?

#include <stdio.h>

union mix {
  unsigned char a1:1;  
  unsigned char a2:4;
  unsigned char a3:4;    
  unsigned char a4:1;  
  unsigned char a5:4;
  unsigned char a6:4;    
  unsigned char a7:1;  
  unsigned char a8:4;
  unsigned char a9:4;    
  unsigned char a10:1;  
  unsigned char a11:4;
  unsigned char a12:4;       
};

int main() {

    printf("Sizeof mix = %d bytes\n", sizeof(union mix));

    return 0;
}

The output is 1 byte.

What happens to bit-field members which exceed 8 bits ? Apparently I can still set and get correct values for any bit-field member.

UPDATE

Thank you for clearing my confusion. One side question: in what order do the bits get stored in memory ? Assuming it is little endian memory so 0xabcd will be stored in memory as 0xd, 0xc, 0xb, 0xa.

  1. Will m.a1 be part of 0xd OR oxa?
  2. Will it be bit 3 or bit 0 of 0xd(or 0xa)?

原文:https://stackoverflow.com/questions/40006207
更新时间:2024-05-03 14:05

最满意答案

这应该工作( meds是带有dicts的列表):

tmp = {}
for med in meds:
    name = med.pop('medication_name')
    tmp.setdefault(name, []).append(med)
res = [{'medication_name': k, 'trend': v}  for k, v in tmp.items()]

结果:

>>> res
[{'medication_name': 'Avonex',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 1},
   {'timeline': '2015-Jul', 'total_prescriptions': 0}]},
 {'medication_name': 'Actemra IV',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 1},
   {'timeline': '2015-Jul', 'total_prescriptions': 0}]},
 {'medication_name': 'Adempas',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 0},
   {'timeline': '2015-Jul', 'total_prescriptions': 0},
   {'timeline': '2015-Aug', 'total_prescriptions': 0}]}]

注意

这会修改原始数据。 您可以使用copy.deepcopy()来避免这种情况:

import copy

tmp = {}
for med in copy.deepcopy(meds):
    ...

This should work (meds is the list with dicts):

tmp = {}
for med in meds:
    name = med.pop('medication_name')
    tmp.setdefault(name, []).append(med)
res = [{'medication_name': k, 'trend': v}  for k, v in tmp.items()]

Result:

>>> res
[{'medication_name': 'Avonex',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 1},
   {'timeline': '2015-Jul', 'total_prescriptions': 0}]},
 {'medication_name': 'Actemra IV',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 1},
   {'timeline': '2015-Jul', 'total_prescriptions': 0}]},
 {'medication_name': 'Adempas',
  'trend': [{'timeline': '2015-Jun', 'total_prescriptions': 0},
   {'timeline': '2015-Jul', 'total_prescriptions': 0},
   {'timeline': '2015-Aug', 'total_prescriptions': 0}]}]

Note

This modifies the original data. You can use copy.deepcopy() to avoid this:

import copy

tmp = {}
for med in copy.deepcopy(meds):
    ...

相关问答

更多

相关文章

更多

最新问答

更多
  • python的访问器方法有哪些
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。
  • 响应navi重叠h1和nav上的h1链接不起作用(Responsive navi overlaps h1 and navi links on h1 isn't working)
  • 在C中读取文件:“r”和“a +”标志的不同行为(Reading a File in C: different behavior for “r” and “a+” flags)
  • NFC提供什么样的带宽?(What Kind of Bandwidth does NFC Provide?)
  • 元素上的盒子阴影行为(box-shadow behaviour on elements)
  • Laravel检查是否存在记录(Laravel Checking If a Record Exists)
  • 设置base64图像的大小javascript - angularjs(set size of a base64 image javascript - angularjs)
  • 想学Linux 运维 深圳有哪个培训机构好一点
  • 为什么有时不需要在lambda中捕获一个常量变量?(Why is a const variable sometimes not required to be captured in a lambda?)
  • 在Framework 3.5中使用服务器标签<%=%>设置Visible属性(Set Visible property with server tag <%= %> in Framework 3.5)
  • AdoNetAppender中的log4net连接类型无效(log4net connection type invalid in AdoNetAppender)
  • 错误:发送后无法设置标题。(Error: Can't set headers after they are sent. authentication system)
  • 等待EC2实例重启(Wait for an EC2 instance to reboot)
  • 如何在红宝石中使用正则表达式?(How to do this in regex in ruby?)
  • 使用鼠标在OpenGL GLUT中绘制多边形(Draw a polygon in OpenGL GLUT with mouse)
  • 江民杀毒软件的KSysnon.sys模块是什么东西?
  • 处理器在传递到add_xpath()或add_value()时调用了什么顺序?(What order are processors called when passed into add_xpath() or add_value()?)
  • sp_updatestats是否导致SQL Server 2005中无法访问表?(Does sp_updatestats cause tables to be inaccessible in SQL Server 2005?)
  • 如何创建一个可以与持续运行的服务交互的CLI,类似于MySQL的shell?(How to create a CLI that can interact with a continuously running service, similar to MySQL's shell?)
  • AESGCM解密失败的MAC(AESGCM decryption failing with MAC)
  • SQL查询,其中字段不包含$ x(SQL Query Where Field DOES NOT Contain $x)
  • PerSession与PerCall(PerSession vs. PerCall)
  • C#:有两个构造函数的对象:如何限制哪些属性设置在一起?(C#: Object having two constructors: how to limit which properties are set together?)
  • 平衡一个精灵(Balancing a sprite)
  • n2cms Asp.net在“文件”菜单上给出错误(文件管理器)(n2cms Asp.net give error on Files menu (File Manager))
  • Zurb Foundation 4 - 嵌套网格对齐问题(Zurb Foundation 4 - Nested grid alignment issues)
  • 湖北京山哪里有修平板计算机的