【问题标题】:what type use for bitset type in C languageC语言中的bitset类型使用什么类型
【发布时间】:2011-06-04 05:54:02
【问题描述】:

我必须定义一个 bitset 类型来构建位数组。 在这些数组之间,像和/或/异或这样的位操作可以 被执行(例如比较它们)并且是 主要业务。 我应该使用什么类型作为 bitset 类型?

我认为类型应该是最宽的 NOT SIMULATED 类型 编译器可以处理。 IE。如果编译器模拟 64 位类型(如果机器 或者操作系统不支持它,例如)掩蔽化合物 一个简单的和之间的操作,一个 32 位类型应该是 改为使用。 如何确定?

还有更多问题:

新的 c99 标头定义了一些类型(精确宽度 整数类型),其中:

“它们的形式是 intN_t 和 uintN_t。这两种类型都必须用 N 位表示,没有填充位。intN_t 必须编码为二进制补码有符号整数,uintN_t 必须编码为无符号整数。这些类型是可选的,除非implementation 支持宽度为 8、16、32 或 64 的类型,然后将它们 typedef 为具有相应 N 的相应类型。任何其他 N 都是可选的。"

所以我认为检查 64 位类型的实现 是第一步吧?

我的项目使用 SDL 库,#defines 一个宏:

#ifdef SDL_HAS_64BIT_TYPE
typedef int64_t     Sint64;
#ifndef SYMBIAN32_GCCE
typedef uint64_t    Uint64;
#endif
#else
/* This is really just a hack to prevent the compiler from complaining */
typedef struct {
    Uint32 hi;
    Uint32 lo;
} Uint64, Sint64;
#endif

所以也许我可以定义位集类型 取决于该宏(但是,它不是最佳的, 因为我想写代码 sdl indipendent)。

说说你的看法吧。

【问题讨论】:

  • 这种数据类型的用户肯定不希望它因平台而异吗?
  • @David:通常你为大型位集创建一个类型的数组,然后底层类型的大小无关紧要,因为它隐藏在实现中。它只是数组中保持不变的总位数。

标签: c bitset


【解决方案1】:

没有一种简单的方法来确定最大大小的非模拟整数类型,而且大多数人都懒得去尝试。您可以采用两种方法中的任何一种,这两种方法都有效。

  1. 决定使用 32 位整数,因为它们无处不在。
  2. 决定您将拥有一个配置宏(不一定来自 SDL),它控制您使用 32 位还是 64 位(或 16 位或 128 位)数据类型。您在配置构建时指定“正确”值。

如果您想检测仿真与原生,您可能会在具有不同乘法大小的测试程序上运行一些计时测试。

【讨论】:

  • 我们还必须定义什么是原生的。当前的 x86 硬件可以在单个时钟周期内并行运行两个 32 位操作。这会使 64 位操作“原生”还是仍在模拟? :-)
  • @Bo Persson:大概,您说的是 IA-32 芯片,而不是 IA-64 或 AMD x86/64 芯片?我认为在 64 位机器上,32 位和 64 位乘法将花费大约相同的时间,而在 32 位机器上,32 位乘法将(很多)比 64 位快乘;但是,我没有证明这一点。我习惯于人工指定尺寸的系统 - 所以上面的选项 2。选项 1 将在许多系统上提供合理的性能,即使不是完全最优。
  • 我说的是@dr 想要执行的and/or/xor。乘法会有所不同。
  • @Bo Persson:是的 - 一旦通过查看哪个乘法工作最快找到了“本机单词”的大小,您将以该单词大小为单位进行 XOR 等。它可能会为不值得为之苦恼的事情苦恼——“假设 32 位”启发式方法很可能非常有效。
【解决方案2】:

对于信号和 fd 集,传统的 Unix 实践是使用 unsigned long(实际上在历史上它甚至可能是 long,但是对位集使用有符号类型是一个非常非常糟糕的主意,并且几乎肯定会导致未定义的行为)。虽然一些古老的 16 位机器的 long 可能大于系统字长,但我认为你很难找到任何有这个问题的现代机器。另一方面,64 位 Windows 有 32 位 long,因此您不会获得最佳类型,但为了简单起见,您还不如接受它,

如果您有 C99 stdint.h 供您使用,另一种方法是使用 uintptr_t。这几乎肯定是机器字长。

另一种绝对以简单性为胜的方法就是始终使用字节。

最后,请注意,在小端系统上,无论您使用什么类型大小,内存中的表示都是相同的。

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 2016-08-25
    • 2011-02-11
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多