为某些位生成一个带整数的集合

时间:2012-03-08 15:51:35

标签: integer set bits

我想要一个描述一组整数的数学表达式。 这组整数应符合以下要求。

假设我有10位。我想生成所有由例如位0,1,2,3,8,9,10组成的整数。例如,该集应该包含例如:

  • 0,因为0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 0 < / LI>
  • 1,因为1 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 1 < / LI>
  • 2,因为0 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 2 < / LI>
  • ...
  • 259,因为1 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 1 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 259 < / LI>
  • ...

因此,这个集合的大小将是2 ^ 7 = 128个元素,因为我们有7个相关位。

数学表达式看起来应该有点像:{n:Nat | n> = 0&amp;&amp; n&lt; 2 ^ 11&amp;&amp; ...(用相关位做某事)......}

仅供参考我需要为称为MCRL2的语言生成一组自然数。 http://www.mcrl2.org/mcrl2/wiki/index.php/Home

1 个答案:

答案 0 :(得分:1)

C中的

,即:

int bits[] = {0,1,2,3,8,9,10};
const int length = sizeof(bits)/sizeof(int);
const int setSize = 1<<length;
int set[setSize] = {0};

for(int i=0; i<setSize; i++) {
   for(int j=0; j<length; j++)
      if(i&1<<j) set[i]+=1<<bits[j];
}

取决于哪些是编译时常量而哪些不是,你可能需要稍微修改一下。