[有人问如何使用位数组实现集合。这是我发布的附加解释中的摘录。]

新闻组:comp.lang.c
发件人:scs@eskimo.com (Steve Summit)
主题:回复:类似 Pascal 的集合实现
Message-ID: <E97GrL.F33@eskimo.com>
日期:1997 年 4 月 25 日星期五 18:02:08 GMT

如果集合可能包含的元素集合(集合论中的那个术语是什么?“全集”?)是已知的,那么要做的事情就是建立这些元素与从 0 开始的整数之间的对应关系。(也就是说,如果全集是“苹果”、“梨”和“橙子”这些元素,则设置苹果 = 0,梨 = 1,橙子 = 2。嗯,您或许可以巧妙地使用枚举来实现这一点。)然后,您想操作的每个集合都是一个BITNSLOTS(n)个元素的数组。要向集合中添加元素,请打开相应的位。要从集合中删除元素,请关闭相应的位。要计算两个集合的并集,请运行循环

	for(i = 0; i < BITNSLOTS(nb); i++)
		set3[i] = set1[i] | set2[i];

交集的计算留给读者作为练习。

显然,打印集合需要遍历所有位,使用BITTEST()来发现每个位是否已打开,然后,如果需要,以某种方式将位索引转换回元素的名称。(我们在一两周前有一个关于如何以符号方式打印枚举值的帖子。在这里,由于已知索引是从 0 开始的整数,一个简单的查找表,即字符串数组,就足够了。)

Steve Summit
scs@eskimo.com