我不能在 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_0
和ff_1
是同一个内存,ff
也是
这就是为什么当您将值分配给 ff_0 时,它会自动分配给 ff_1。
所以你观察到的是正确的。
您应该做的是,创建一个包含 15 位字段的结构。那么 union 应该是 struct 和 unsigned short。
我想在 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_0
和ff_1
是同一个内存,ff
也是
这就是为什么当您将值分配给 ff_0 时,它会自动分配给 ff_1。
所以你观察到的是正确的。
您应该做的是,创建一个包含 15 位字段的结构。那么 union 应该是 struct 和 unsigned short。