首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不能在C中操作位字段

我不能在C中操作位字段
EN

Stack Overflow用户
提问于 2019-08-30 10:14:24
回答 3查看 125关注 0票数 3

我想在C中实现线性反馈移位寄存器(LFSR)来产生随机比特。当我试图修改一个单独的位,或者只是给内存块分配一个短值时,所有的位都设置为1。我如何阻止这种情况发生呢?

代码语言:javascript
复制
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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-30 10:23:46

问题是,联合意味着的每个位位字段成员都访问完全相同的一位。你想做的是

代码语言:javascript
复制
union lfsr{
    //... 
    struct {
        unsigned short ff_0 : 1;
        unsigned short ff_1 : 1;
        //... 
        unsigned short ff_f : 1;
    }flip_flops;

    unsigned short ff;
};
票数 8
EN

Stack Overflow用户

发布于 2019-08-30 10:24:24

你可能对工会有不同的理解。所有的位字段都在同一个位置进行别名。你可能想做这样的事:

代码语言:javascript
复制
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关于结构和联合之间的差异。

更新:

正如关于基于体系结构的位字段对齐的注释@-busybee,关于代码跨各种体系结构的可移植性,也值得注意。

关于位的讨论,请参考答案here

票数 4
EN

Stack Overflow用户

发布于 2019-08-30 10:24:47

当您声明一个Union时,联合的所有元素都是同一内存的一部分。只是访问方式不同而已。

代码语言:javascript
复制
 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位字段的结构。那么联合应该是结构化的,没有签名的短。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57724837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档