C中的位字段?

C中的位字段?,c,bit-fields,C,Bit Fields,大家好 我们是否可以通过声明变量来指定那些不是结构或联合的任何成员的位字段。如果不是,那么我们是否可以通过指定允许使用的位数来声明变量 谢谢 maddy否-除非它恰好与内置类型(例如8、16、32或64位)大小相同,否则您需要将其嵌入到结构中。否-除非它恰好与内置类型(例如8、16、32或64位)大小相同,否则您需要将其嵌入到结构中。否,您应该使用所示的技术,您应该使用所示的技术一种非常简单且古老的技术是只定义一些#定义其值对应于位位置的变量,然后使用and或OR操作来清除或设置它们。 e、 g

大家好

我们是否可以通过声明变量来指定那些不是结构或联合的任何成员的位字段。如果不是,那么我们是否可以通过指定允许使用的位数来声明变量

谢谢
maddy

否-除非它恰好与内置类型(例如8、16、32或64位)大小相同,否则您需要将其嵌入到结构中。

否-除非它恰好与内置类型(例如8、16、32或64位)大小相同,否则您需要将其嵌入到结构中。

否,您应该使用所示的技术,您应该使用所示的技术一种非常简单且古老的技术是只定义一些#定义其值对应于位位置的变量,然后使用and或OR操作来清除或设置它们。 e、 g

然后使用它们设置标准变量中的位位置,例如

int someVariable = 0;

someVariable = someVariable | BIT_1; //set bit 1 to 1. someVariable = 2

someVariable = someVariable & ~BIT_1; // clear bit 1. someVariable = 0
没有效率或者不聪明,但是容易阅读

编辑-添加 如果要限制哪些位可有效使用,请按如下方式设置要应用的掩码值:

#define VALID_BIT_MASK 0x0009 // thus only bits 3 and 0 are valid
例如

someVariable = someVariable | BIT_0 | BIT_2 | BIT_4; // someVariable now has value 21

someVariable = someVariable & VALID_BIT_MASK; // remove invalid  bits, someVariable value is now 1
显然,某些变量将是byte、unsigned int或unsigned long,但假设您只需要一个unsigned int的11位集合(16位)


一种非常简单而古老的技术是只定义一些#定义其值对应于位位置的变量,然后使用and和OR操作来清除或设置它们。 e、 g

然后使用它们设置标准变量中的位位置,例如

int someVariable = 0;

someVariable = someVariable | BIT_1; //set bit 1 to 1. someVariable = 2

someVariable = someVariable & ~BIT_1; // clear bit 1. someVariable = 0
没有效率或者不聪明,但是容易阅读

编辑-添加 如果要限制哪些位可有效使用,请按如下方式设置要应用的掩码值:

#define VALID_BIT_MASK 0x0009 // thus only bits 3 and 0 are valid
例如

someVariable = someVariable | BIT_0 | BIT_2 | BIT_4; // someVariable now has value 21

someVariable = someVariable & VALID_BIT_MASK; // remove invalid  bits, someVariable value is now 1
显然,某些变量将是byte、unsigned int或unsigned long,但假设您只需要一个unsigned int的11位集合(16位)


使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为它保留8、16、32或64位的空间;然后编译器将创建8位空间来存储它。因为CPU无法读取不是8的倍数的内存,所以使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为它保留8、16、32或64位的空间;然后编译器将创建8位空间来存储它。由于CPU无法读取ARM环境中不是8的倍数的内存,因此在使用C配置SOC硬件组件时,通常使用位字段操作。 LPC_SC->FLASHCFG=(LPC_SC->FLASHCFG&~0x0000F000)| FLASHCFG_Val; 用FLASHCFG_Val值更新配置寄存器中的4位字段。
或者,在ARM环境中(!(LPC_SC->PLL1STAT&(1)时,在使用C配置SOC的硬件组件时,通常使用位字段操作。 LPC_SC->FLASHCFG=(LPC_SC->FLASHCFG&~0x0000F000)| FLASHCFG_Val; 用FLASHCFG_Val值更新配置寄存器中的4位字段。
或者,当(!(LPC_SC->PLL1STAT&(1@stacker-那一个不够清楚。如果可能有更好的解释吗?@stacker那一个不够清楚。如果可能有更好的解释吗?@ChrisBD----这是一个很好的建议,但是我们是否可以通过它来限制既不是结构成员也不是联合成员的变量的大小?非常感谢先生,那太好了usefull@ChrisBD----这是一个很好的建议,但我们是否可以通过它来限制既不是结构成员也不是联盟成员的变量的大小?非常感谢,先生。这非常有用