问题标签 [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 投票
7 回答
8739 浏览

c++ - C/C++ 位域与按位运算符区分位,哪个更快、更好、更便携?

我需要以这种方式将一些位打包成一个字节:

或者:

从源代码的清晰度来看,对我来说很明显位域更整洁。但是哪个选项更快?我知道速度差异不会太大,但我可以使用它们中的任何一个,如果一个更快,更好。
另一方面,我读到位域不能保证跨平台以相同的顺序排列位,我希望我的代码是可移植的。

注意:如果您打算回答“个人资料”,我会的,但由于我很懒,如果有人已经有了答案,那就更好了。
代码可能是错误的,如果您愿意,可以纠正我,但请记住这个问题的意义,并请尝试回答。

0 投票
7 回答
15634 浏览

c# - 在 C# 中,如何轻松地将枚举标志从一种类型映射到另一种类型?

另请参阅问题末尾的更新...

鉴于以下情况:

我想使用大 switch() 之类的名称基于映射函数将一种枚举类型转换为另一种类型,反之亦然,但由于这是一个标志枚举,我很难将这样的例程设计为通用的。

基本上,我想要的是如下内容:

示例 #1

示例 #2

示例#3

示例 #4

示例#5

Map() 函数可以接受一个委托来提供实际的映射,但我仍然需要有几个函数来帮助这样一个委托的位......

编辑:澄清

枚举定义的值似乎彼此适合,但不一定如此。

例如,它可能是:

编辑:更多信息

我正在研究一种对枚举标志进行自定义映射的方法,而不是基于名称上的模式。但是,这些名称用于自定义映射函数。

例如,我完全有可能拥有一个 SourceToDestMapper 函数来尝试将 SA 映射到 DC...

主要问题是为 SourceToDestMapper 函数提供源的每个标志,并处理具有多个位集的标志值......

例如:拥有一个标志 SourceEnum.SABC 将调用 SourceToDestMapper 函数 3 次,结果如下:

  • SourceEnum.SA 映射到 DestEnum.DA
  • SourceEnum.SB 映射到 DestEnum.DB
  • SourceEnum.SC 映射到 DestEnum.DC

结果 DestEnum 将是: DestEnum.DA | 目标枚举.DB | 目标枚举.DC

0 投票
3 回答
1580 浏览

c# - 位域枚举扩展方法返回包含值的字典

枚举肯定会令人困惑。我正在尝试在 Enum 类型上创建一个扩展方法,该方法将采用一个值并返回所有匹配位的名称。

鉴于:

我想创建一个仅返回所选值的字典的扩展方法。因此,如果:

我希望看到 Mars & Venus 写入控制台,但我看到的是 PlanetEnum 的所有值。这是我的扩展方法代码:

有谁看到我做错了什么?我知道这Enum.GetValues是返回枚举类型的所有字段,我如何让它只返回枚举实例的字段?

非常感谢您的帮助,

基思

0 投票
3 回答
9308 浏览

c - 非 int 类型的位域?

我有一个代码,它使用如下声明的位域

uint8_t类型定义为unsigned char.

使用此位字段在 MS-VS 2008 中构建代码会给出如下警告:

  1. 使用非 int 类型的位字段是否有任何问题/潜在问题?为什么要发出警告?
  2. 除了 C99 C 语言规范允许的 int 类型位文件吗?
0 投票
3 回答
25112 浏览

c - 将位字段转换为 int

我有这样声明的位字段:

我也有 int 数组,我想从这个数组中获取 int 值,它代表这个位字段的实际值(这实际上是某种机器字,我有它的一部分,我想要 int 表示整个词)。

0 投票
2 回答
2356 浏览

c - 在 C 中重新定义寄存器位域的技巧

我正在努力想出一种干净的方法来重新定义一些寄存器位域,以便在我正在使用的芯片上使用。

例如,这是 CAN 配置寄存器之一的定义:

这些定义都不是很有帮助,因为我需要像下面这样分配 BRP 和 SJW:

以下是我做过的两次尝试:

尝试#1:

尝试#2:

有没有“更清洁”的方法来完成我想做的事情?此外,我对尝试 #2 中近乎不稳定的演员感到有些恼火。是否有必要指定一个变量是近的?

0 投票
3 回答
8532 浏览

c++ - C ++中的位域有多慢

我有一个 C++ 应用程序,其中包含许多带有手动控制位字段的结构,例如

出于显而易见的原因,我想将其更改为使用位字段,例如

进行此切换时我担心的一个问题是,我在该站点上遇到了许多参考资料,说明了 C++ 中位字段的速度有多慢。我的假设是它们仍然比上面显示的手动代码更快,但是是否有任何硬参考材料涵盖在各种平台上使用位字段的速度影响,特别是 32 位和 64 位窗口。该应用程序处理内存中的大量数据,并且必须既快速又高效,这很可能是它最初以这种方式编写的原因。

0 投票
4 回答
6727 浏览

c++ - 结构位域最大大小(C99,C++)

位结构字段的最大位宽是多少?

我可以在 struct 中定义一个位域,位域的大小最多为 128 位、256 位或更大吗?有一些超宽向量类型,如 sse2(128 位)、avx1/avx2(256 位)、avx-512(下一个 Xeon Phis 为 512 位)寄存器;还有像gcc 中的__int128这样的扩展。

0 投票
3 回答
4936 浏览

c++ - 如何让位域以正确的顺序排列我的位?

首先,有问题的应用程序总是在同一个处理器上,编译器总是 gcc,所以我不担心位域不可移植。

gcc 对位域进行布局,使第一个列出的域对应于字节的最低有效位。所以下面的结构,a =0,​​ b =1, c =1, d =1,你得到一个字节值 e0。

(其实这是C++,所以我说的是g++。)

现在假设我希望a是一个六位整数。

现在,我明白为什么这不起作用了,但我编写了以下结构:

bcd设置为 1,将 a设置为 0 会产生以下两个字节:

这不是我想要的。我希望看到这个:

有没有办法指定一个结构,它在第一个字节的最高有效位中有 3 位,在第一个字节的 5 个最低有效位和第二个字节的最高有效位中有 6 个位?

请注意,我无法控制这些位的布局位置:它是由其他人的界面定义的位布局。

0 投票
5 回答
1495 浏览

c - C中的位域?

大家好,

无论如何我们可以通过它声明变量指定位字段的那些不是结构或联合的任何成员。如果没有,那么无论如何我们可以通过指定允许使用的位数来声明一个变量.

谢谢麦迪