全部,
无论如何,我们可以声明变量指定那些不是结构或联合的任何成员的位字段。如果没有,那么无论如何我们可以通过指定它的位数来声明变量允许使用。
由于 麦迪
答案 0 :(得分:4)
一种非常简单和旧的技术是定义一些#define变量,其值对应于位位置,然后使用AND和OR运算来清除或设置它们。 e.g。
#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,但是说你只需要11位的unsigned int(16位)。
#define VALID_BIT_MASK 0x07FF; // 011111111111 in binary.
someVariable = someVariable & VALID_BIT_MASK; //strips off unwanted bits.
答案 1 :(得分:0)
否 - 除非它的大小与内置类型相同(例如8,16,32或64位),否则您需要将其嵌入到结构中。
答案 2 :(得分:0)
不,您应该使用显示here
的技术答案 3 :(得分:0)
使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为它保留空间8,16,32或64位。如果你声明变量unsigned x:5;然后编译器将创建8位空间来存储它。因为CPU不能读取不是8的倍数的存储器
答案 4 :(得分:0)
在ARM上下文中,使用C配置SOC的硬件组件时,使用按位字段操作很常见。 LPC_SC-&gt; FLASHCFG =(LPC_SC-&gt; FLASHCFG&amp; ~0x0000F000)| FLASHCFG_Val; 使用FLASHCFG_Val的值更新配置寄存器中的4位字段。 或者,while(!(LPC_SC-&gt; PLL1STAT&amp;(1&lt;&lt; 10))); //等待PLOCK1 测试状态寄存器中的单个位,其中1 <&lt; 10表示第10位的位置。