c - 联合的位字段用法
问题描述
我想使用联合创建一个带有位字段的简单包。但是当我尝试将“bit1”设置为 1 时,我的所有位字段都变为“1”。我该如何解决这个问题,我想通过使用联合而不是使用结构来完成位字段部分。
所以这里是我的结构;
struct {
union{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[]) {
myStruct_t.bits.bit1 = 1;
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.bits);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
输出为:000。
解决方案
union
用你的交换你的struct
。
即我相信你想要一个结构和一个int的联合,而不是一个联合和一个int的结构。(我保留了现在具有误导性的名称myStruct_t
,可能myUnion_t
现在应该是。)
#include <stdio.h>
#include <stdint.h>
union
{
struct
{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[])
{
myStruct_t.trial=0; // use the encompassing union member for init
myStruct_t.bits.bit1 = 1; // now use the bitwise view to set bits
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.trial);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
我得到的输出是 110,你可能会看到 12810。除了缺少换行符,这会有所帮助,这意味着:
- 包含的 8 位视图的值为 1,至少在我的环境的字节序中 - 你可能会看到 128
- 位 1 的值为 1
- 位 2 的值为 0
推荐阅读
- java - Java rest server: avoid the removal of an item while processing it
- django - 测试时如何在不遵守空约束的情况下保存模型?
- django - 413 Payload Too Large on Django server
- python - How to drag the icon when using drag and drop
- cassandra - Cassandra删除查询,如果条件不起作用
- xpath - Evaluate xpath selector to get text in p- and li-tags
- pdf - pdf差异数组中的不熟悉格式
- r - 如何将表格的白色背景与数据表中列的 styleColorbar 结合起来?
- javascript - Javascript 在 jsfiddle 但不是 wordpress 网站上工作?
- angular - Angular 6:如何设置生产和开发基础 url