我在optimusfrenk上发现了一个帖子,建议在一个记忆词中对一组数字进行编码以获取交集,他说:“例如,您可以对{0,2,3,6,7进行编码}在记忆字中:... 00000011001101。“;我在这里和网上都找不到有关此的任何信息。
我该如何在c中做到这一点?
谢谢
答案 0 :(得分:2)
“ [[...]在存储字:... 00000011001101中对集合{0,2,3,6,7}进行编码。”
位
00000011001101
|| || |
|| || +- 0
|| |+--- 2
|| +---- 3
|+------- 6
+-------- 7
已设置。
要设置一点用
value |= (1<<n);
清除一点
value &= ~(1<<n);
答案 1 :(得分:0)
您可以为集合中的任何元素分配一个位。并使用按位算术计算派生集。
我们这么说
elem_0 = 0b1;
elem_2 = 0b10;
elem_3 = 0b100;
elem_6 = 0b1000;
elem_7 = 0b10000;
现在,您可以通过对元素进行“或”操作来创建集合。
set1 = elem_0 | elem_3;
set2 = elem_3 | elem_6 | elem_7;
现在,您可以计算交集(和):
intersect = set1 & set2; // == 0x100 == elem_3
或联合(或):
union = set1 | set2; // == 0x11101 == elem_0 | elem_3 | elem_6 | elem_7
互补集(否定)...等等。