我想在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
}发布于 2019-08-30 10:23:46
问题是,联合意味着的每个位位字段成员都访问完全相同的一位。你想做的是
union lfsr{
//...
struct {
unsigned short ff_0 : 1;
unsigned short ff_1 : 1;
//...
unsigned short ff_f : 1;
}flip_flops;
unsigned short ff;
};发布于 2019-08-30 10:24:24
发布于 2019-08-30 10:24:47
当您声明一个Union时,联合的所有元素都是同一内存的一部分。只是访问方式不同而已。
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位字段的结构。那么联合应该是结构化的,没有签名的短。
https://stackoverflow.com/questions/57724837
复制相似问题