如何在单个记忆字中编码一组数字?

时间:2018-10-06 15:06:20

标签: c

我在optimusfrenk上发现了一个帖子,建议在一个记忆词中对一组数字进行编码以获取交集,他说:“例如,您可以对{0,2,3,6,7进行编码}在记忆字中:... 00000011001101。“;我在这里和网上都找不到有关此的任何信息。

我该如何在c中做到这一点?

谢谢

2 个答案:

答案 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

互补集(否定)...等等。