答案 0 :(得分:13)
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));
}
不要使用特定大小(例如使用uint64或uint32),让计算机使用它想要使用的内容并使用sizeof来适应它。
答案 1 :(得分: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)
答案 2 :(得分:3)
嗯,字节bitset []似乎有点误导,不是吗?
在结构中使用位字段,然后您可以维护这些类型的集合(或者在您认为合适时使用它们)
struct packed_struct {
unsigned int b1:1;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
/* etc. */
} packed;
答案 3 :(得分:2)
我推荐我的BITSCAN C++ library(版本1.0刚刚发布)。 BITSCAN专门用于快速位扫描操作。我用它来实现涉及简单无向图的NP-Hard组合问题,例如最大团(参见BBMC算法,用于领先的精确求解器)。
BITSCAN与标准解决方案之间的比较STL bitset 和BOOST dynamic_bitset 可在此处获得: http://blog.biicode.com/bitscan-efficiency-at-glance/
答案 4 :(得分:1)
您可以尝试使用bitsPerItem
1
来试用PackedArray代码。
它实现了一个随机访问容器,其中项目在位级别打包。换句话说,它就像你能够操纵一个例如uint9_t
或uint17_t
数组:
PackedArray principle:
. compact storage of <= 32 bits items
. items are tightly packed into a buffer of uint32_t integers
PackedArray requirements:
. you must know in advance how many bits are needed to hold a single item
. you must know in advance how many items you want to store
. when packing, behavior is undefined if items have more than bitsPerItem bits
PackedArray general in memory representation:
|-------------------------------------------------- - - -
| b0 | b1 | b2 |
|-------------------------------------------------- - - -
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 |
|-------------------------------------------------- - - -
. items are tightly packed together
. several items end up inside the same buffer cell, e.g. i0, i1, i2
. some items span two buffer cells, e.g. i3, i6
答案 5 :(得分:0)
与往常一样,您需要先确定需要对bitset执行哪种操作。也许是Java定义的一些子集?之后,您可以决定如何最好地实现它。你当然可以在OpenJDK中查看BitSet.java的源代码来获取想法。
答案 6 :(得分:-2)
使它成为unsigned int 64的数组。