我无法在C中操纵位字段

时间:2019-08-30 10:14:24

标签: c unions bit-fields

我想在C中实现LFSR(线性反馈移位寄存器)以生成随机位。当我尝试修改单个位或只给存储块分配一个短值时,所有位都设置为1。如何阻止这种情况发生?

struct lfsr{
    //... 
    union{
        unsigned short ff_0 : 1;
        unsigned short ff_1 : 1;
        //... 
        unsigned short ff_f : 1;
        unsigned short ff;
    }flip_flops;
};

int main() {
    struct lfsr gen;
    gen.flip_flops.ff = 1;      //all the ff's set to 1
    gen.flip_flops.ff = htons(0x0001);//all the ff's set to 1
    gen.flip_flops.f_0 = 1;     //all the ff's set to 1
    gen.flip_flops.f_0 = 0;     //all the ff's set to 0
}

3 个答案:

答案 0 :(得分:8)

问题在于,并集意味着每个和每个一位比特位成员都访问完全相同的一位。您想做的是

union lfsr{
    //... 
    struct {
        unsigned short ff_0 : 1;
        unsigned short ff_1 : 1;
        //... 
        unsigned short ff_f : 1;
    }flip_flops;

    unsigned short ff;
};

答案 1 :(得分:4)

您对工会的理解可能有所不同。所有位字段在同一位置都具有别名。您可能想要执行以下操作:

struct lfsr{
  //... 
  union{
    struct {
      unsigned short ff_0 : 1;
      unsigned short ff_1 : 1;
      //... 
      unsigned short ff_f : 1;
    };
    unsigned short ff;
  }flip_flops;
};

您可以here来了解结构体和联合体之间的差异。

更新
根据@ the-busybee的评论,关于基于体系结构的位字段的对齐也值得注意在跨各种体系结构的代码的可移植性。
请参阅答案here,以了解有关位耐力的讨论。

答案 2 :(得分:3)

声明联合时,联合的所有元素都属于同一内存。只是以不同的方式访问它们。

 union{
        unsigned short ff_0 : 1;
        unsigned short ff_1 : 1;
        //... 
        unsigned short ff_f : 1;
        unsigned short ff;
    }flip_flops;

这里,ff_0ff_1是相同的内存,ff也是如此 这就是为什么在将值分配给ff_0时会自动将其分配给ff_1的原因。 因此,您所观察的是正确的。

您应该做的是,创建一个包含15位字段的结构。然后,union应该为struct并且无符号short。