我不能在 C 中操作位字段

I can't manipulate bit fields in C

我想在 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
}

问题在于联合意味着每个 一位位域成员访问完全相同的一位。你想做的是

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

    unsigned short ff;
};

您可能对联合有不同的理解。所有位字段在同一位置使用别名。你可能想做这样的事情:

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

当你声明一个联合体时,联合体的所有元素都是同一内存的一部分。它们只是访问方式不同。

 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 和 unsigned short。