Генерация набора с целыми числами для определенных битов - PullRequest
1 голос
/ 08 марта 2012

Я хотел бы иметь математическое выражение, которое описывает набор целых чисел.Этот набор целых чисел должен соответствовать следующему.

Предположим, у меня есть 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
  • 1потому что 1 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 1
  • 2, потому что 0 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 8 + 0 * 2 ^ 9 + 0 * 2 ^ 10 = 2
  • ...
  • 259, потому что 1 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 0 * 2 ^ 3 + 1 * 2 ^ 8 + 0 * 2 ^ 9+ 0 * 2 ^ 10 = 259
  • ...

Таким образом, размер этого набора будет 2 ^ 7 = 128 элементов, потому что у нас есть 7 соответствующих битов.

Математическое выражение должно выглядеть примерно так: {n: Nat |n> = 0 && n <2 ^ 11 && ... (что-то сделать с соответствующими битами) ...} </p>

К вашему сведению Мне нужно сгенерировать набор натуральных чисел для языка MCRL2.http://www.mcrl2.org/mcrl2/wiki/index.php/Home.

1 Ответ

1 голос
/ 08 марта 2012

в 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];
}

в зависимости от того, какие вещи являются константами времени компиляции, а какие нет, вам может потребоваться немного изменить его.

...