【问题标题】:Bit fields in C?C中的位域?
【发布时间】:2010-04-26 08:53:56
【问题描述】:

大家好,

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

谢谢 麦迪

【问题讨论】:

    标签: c bit-fields


    【解决方案1】:

    一个非常简单且古老的技术是定义多个#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.
    

    【讨论】:

    • @ChrisBD----这是一个很好的建议,但无论如何我们可以通过它来限制既不是结构也不是联合成员的变量的大小?
    • 非常感谢先生。这非常有用
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不,你应该使用here显示的技术

      【讨论】:

      • @stacker-那个不够清楚。如果可能的话,有什么更好的解释吗?
      【解决方案4】:

      使用内置类型以外的位声明变量没有任何好处。因为编译器最终会为其保留 8、16、32 或 64 位空间。例如,如果您声明变量 unsigned x:5;然后编译器将创建 8 位空间来存储它。因为 CPU 无法读取不是 8 倍数的内存

      【讨论】:

        【解决方案5】:

        在 ARM 上下文中,使用 C 配置 SOC 的硬件组件时,通常使用按位字段操作。 LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; 用 FLASHCFG_Val 的值更新配置寄存器中的 4 位字段。 或者,while (!(LPC_SC->PLL1STAT & (1

        【讨论】:

          猜你喜欢
          • 2010-09-06
          • 2023-03-10
          • 1970-01-01
          • 2010-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多