大家好,
无论如何我们可以通过它声明变量指定位字段的那些不是结构或联合的任何成员。如果没有,那么无论如何我们可以通过指定允许使用的位数来声明一个变量.
谢谢麦迪
一个非常简单且古老的技术是只定义一些 #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 将是字节、无符号整数或无符号长整数,但假设您只需要无符号整数(16 位)的 11 位集。
#define VALID_BIT_MASK 0x07FF; // 011111111111 in binary.
someVariable = someVariable & VALID_BIT_MASK; //strips off unwanted bits.
否 - 除非它恰好与内置类型(例如 8、16、32 或 64 位)大小相同,否则您需要将其嵌入到结构中。
不,您应该使用此处显示的技术
使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为其保留 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<<10)));// 等待 PLOCK1 测试状态寄存器中的单个位,其中 1<<10 表示第 10 位位置。