问题标签 [bit-fields]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
32839 浏览

c# - 在标志上使用位运算符

我有四个标志

假设我收到了过去和未来的两个标志 ( setFlags(PAST | FUTURE))。我怎么知道是否Past在里面?同样,我怎么能Current说它不在里面?这样我就不必测试每一种可能的组合。

0 投票
3 回答
2980 浏览

c - 在 C 中使用位域的正确方法是什么?

我正在使用位域来轻松访问我正在尝试为没有 FPU 的微控制器制作的浮点库。

问题是我似乎无法使其与位域一起使用。看一看:

问题是,当我尝试访问或更改任何内容时,它会将位域分别视为从末尾开始的 1、8、23 位。虽然它应该是从末尾开始的 23 位,然后是 8 位,然后是最后一位。除非我完全误解了位域的使用。我认为使用打包可以解决问题,但正如您所见,它没有。

任何帮助将非常感激。我不止一次在谷歌搜索时被引导到这个网站,所以我寄予厚望。

0 投票
7 回答
13242 浏览

c++ - 在 C++ 中初始化位域结构的最佳方法是什么?

在 C++ 中,我有一个包含匿名位域结构的类。我想将其初始化为零,而不必手动写出所有字段。

我可以想象将初始化放在三个地方:

  1. 在位域中创建构造函数
  2. 在包含类的构造函数的初始化列表中清零
  3. 在包含类的构造函数主体中清零

这个位域有很多字段,我不想一一列举。

例如看下面的代码:

其中之一更可取吗?还是我还缺少其他东西?

编辑:根据下面接受的答案(由 Ferruccio 提供),我选择了这个解决方案:

0 投票
3 回答
1910 浏览

c++ - 为什么相同数据类型的位域与混合数据类型的位域相比具有较小的大小

我很想知道为什么具有相同数据类型的位字段比混合数据类型占用更少的大小。

sizeof(xyz) = 4 sizeof(abc) = 12。

我正在使用 VS 2005,64 位 x86 机器。

一点机器/编译器级别的答案会很棒。

0 投票
21 回答
40106 浏览

c++ - 使用 -1 将所有位设置为真是否安全?

我已经看到这种模式在 C 和 C++ 中使用了很多。

这是实现此目的的一种很好的便携方式吗?还是正在使用0xffffffff~0更好?

0 投票
5 回答
3617 浏览

c - 从 C 中的大结构中获取子结构

struct在现有程序中有一个非常大的。该结构包含大量位域。

我希望保存其中的一部分(例如,150 个字段中的 10 个)。

我用来保存子类的示例代码是:

我也希望选择它的哪一部分不会太麻烦,因为我希望时不时地改变它。我之前提出的幼稚方法非常脆弱且无法维护。当扩展到 20 个不同的字段时,您必须同时更改smallstructsubstruct函数中的字段。

我想到了两种更好的方法。不幸的是,两者都需要我使用一些外部CIL 之类的工具来解析我的结构。

第一种方法是自动生成substruct函数。我将只设置 的结构smallstruct,并有一个程序来解析它并substruct根据 中的字段生成函数smallstruct

第二种方法是构建(使用 C 解析器)关于 的元信息bigstruct,然后编写一个库,允许我访问结构中的特定字段。这就像 Java 类反射的临时实现。

例如,假设没有结构对齐,对于 struct

我将生成以下元信息:

我将使用此函数获取第ith字段:

这两种方法都需要额外的工作,但是一旦解析器在您的 makefile 中 - 更改子结构是轻而易举的事。

但是,我宁愿在没有任何外部依赖的情况下这样做。

有没有人有更好的主意?在我的想法有什么好处的地方,我的想法在互联网上是否有一些可用的实施方式?

0 投票
9 回答
1608 浏览

c - 位域:设置与测试和设置(用于性能)

我有大量这样的 C 结构实例:

  • flag最初为 0,但在退出某个函数时必须为 1。

最简单的实现是:

但是这样做对性能的可能影响是什么:

我希望避免写入主存储器。第一个版本总是进行写入,第二个版本仅在尚未设置标志的情况下执行写入,但在绝大多数情况下,标志已经设置。

还有哪些其他因素(例如分支预测)可能会影响性能?

到目前为止,我已经看到了速度的小幅提升,我希望随着数据集变得更大,它会变得更加显着。

对于大型数据集,这种变化是否存在使程序变慢的风险,如果是这样,在什么情况下会发生这种情况?

0 投票
6 回答
2170 浏览

c++ - 具有别名的可变大小位域

我有一些包含位域的结构,其大小可能会有所不同。例子:

以及一次访问所有位的联合:

问题是:对于某些位域基类,一个 uint8_t 是不够的。BitfieldSmall 确实适合 uint8_t,但 BitfieldLarge 不适合。数据需要尽可能紧密地打包(稍后将由 SSE 指令处理),因此始终使用 uint16_t 是没有问题的。有没有办法用整数类型声明“全部”字段,其大小与位域相同?或者另一种访问整体位的方法?

我当然可以放弃使用模板并明确声明每种位域,但我想避免代码重复(有很多运算符和成员函数)。

0 投票
5 回答
2175 浏览

c - C中的位域掩码

C 中是否有一种可移植的方式来在编译时找出位字段的掩码?

理想情况下,我希望能够以原子方式清除这样的字段:

否则我必须对结构进行锁定,这比我想要的要重。

0 投票
4 回答
515 浏览

c - 删除结构中的位字段

我有个问题。我有一个在结构中使用位字段的遗留应用程序。像这样的东西

所以three只能有MAX31 的值。

现在我需要MAX增加three. 我打算删除位字段。现在它将处理更多内存。除此之外,我还有什么需要注意的吗?它会造成更多其他伤害吗?