在C语言中用于bitset类型的类型

时间:2011-06-04 05:54:02

标签: c bitset

我必须定义一个bitset类型来构建位数组。 在这些数组之间的位操作和/或/ xor可以 执行(比较它们,例如)和 占主导地位的行动。 我应该使用什么类型作为bitset类型?

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

还有更多问题:

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

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

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

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

#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

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

告诉我你的意见。

2 个答案:

答案 0 :(得分:1)

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

  1. 决定使用32位整数,因为它们随处可用。
  2. 确定您将拥有一个配置宏(不一定是SDL中的配置宏),它控制您使用的是32位还是64位(或16位或128位)数据类型。在配置构建时指定“正确”值。
  3. 如果你想检测模拟vs本机,你可能会对具有不同大小的乘法的测试程序运行一些时序测试。

答案 1 :(得分:0)

对于信号和fd集,传统的Unix实践是使用unsigned long(实际上历史上它甚至可能是long,但是对于位集使用签名类型是一个非常糟糕的想法,几乎可以肯定导致未定义的行为)。虽然一些古老的16位机器可能比系统字大小long,但我认为你很难找到任何具有该问题的现代机器。另一方面,64位Windows具有32位long,因此您无法获得最佳类型,但为了简单起见,您可能也会使用它,

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

另一种方法,肯定胜过简单,只是总是使用字节。

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