【发布时间】:2010-04-26 08:53:56
【问题描述】:
大家好,
无论如何我们可以通过它声明变量指定位字段的那些不是结构或联合的任何成员。如果没有,那么无论如何我们可以通过指定它的位数来声明一个变量允许使用。
谢谢 麦迪
【问题讨论】:
标签: c bit-fields
大家好,
无论如何我们可以通过它声明变量指定位字段的那些不是结构或联合的任何成员。如果没有,那么无论如何我们可以通过指定它的位数来声明一个变量允许使用。
谢谢 麦迪
【问题讨论】:
标签: c bit-fields
一个非常简单且古老的技术是定义多个#define 变量,其值对应于位位置,然后使用 AND 和 OR 操作来清除或设置它们。 例如
#define BIT_0 0x0001
#define BIT_1 0x0002
#define BIT_2 0x0004
#define BIT_3 0x0008
#define BIT_4 0x0010
然后您可以使用它们在标准变量中设置位位置,例如
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
显然 someVariable 将是 byte、unsigned int 或 unsigned long,但假设您只需要 unsigned int(16 位)的 11 位集。
#define VALID_BIT_MASK 0x07FF; // 011111111111 in binary.
someVariable = someVariable & VALID_BIT_MASK; //strips off unwanted bits.
【讨论】:
否 - 除非它恰好与内置类型(例如 8、16、32 或 64 位)大小相同,否则您需要将其嵌入到结构中。
【讨论】:
不,你应该使用here显示的技术
【讨论】:
使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为其保留 8、16、32 或 64 位空间。例如,如果您声明变量 unsigned x:5;然后编译器将创建 8 位空间来存储它。因为 CPU 无法读取不是 8 倍数的内存
【讨论】:
在 ARM 上下文中,使用 C 配置 SOC 的硬件组件时,通常使用按位字段操作。 LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; 用 FLASHCFG_Val 的值更新配置寄存器中的 4 位字段。 或者,while (!(LPC_SC->PLL1STAT & (1
【讨论】: