如何在C中实现bitset?

Dav*_*les 9 c bitset

我一直在使用Java中的Bitset类,我想在C中做类似的事情.我想我必须手动完成它作为C中的大多数东西.什么是有效的实现方法?

byte bitset[]
Run Code Online (Sandbox Code Playgroud)

也许

bool bitset[]
Run Code Online (Sandbox Code Playgroud)

Mik*_*iak 14

CCAN有一个可以使用的bitset实现:http://ccan.ozlabs.org/info/jbitset.html

但是如果你最终自己实现它(例如,如果你不喜欢该包的依赖项),你应该使用一个int数组并使用计算机体系结构的原生大小:

#define WORD_BITS (8 * sizeof(unsigned int))

unsigned int * bitarray = (int *)calloc(size / 8 + 1, sizeof(unsigned int));

static inline void setIndex(unsigned int * bitarray, size_t idx) {
    bitarray[idx / WORD_BITS] |= (1 << (idx % WORD_BITS));
}
Run Code Online (Sandbox Code Playgroud)

不要使用特定大小(例如使用uint64或uint32),让计算机使用它想要使用的内容并使用sizeof来适应它.

  • `sizeof`以字节为单位,而不是位.你需要乘以8(或者更常见的是`CHAR_BIT`在某些表达式中. (2认同)

小智 10

没有人提到C FAQ推荐的内容,这是一堆好老的宏:

#include <limits.h>     /* for CHAR_BIT */

#define BITMASK(b) (1 << ((b) % CHAR_BIT))
#define BITSLOT(b) ((b) / CHAR_BIT)
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a, b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT)
Run Code Online (Sandbox Code Playgroud)

(通过http://c-faq.com/misc/bitsets.html)