Создайте набор с целыми числами для определенных битов

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

Предположим, у меня есть 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 && ...(сделать что-нибудь с соответствующими битами)... }

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


person meijuh    schedule 08.03.2012    source источник
comment
Да, это вопрос домашнего задания.   -  person meijuh    schedule 08.03.2012


Ответы (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];
}

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

person enobayram    schedule 08.03.2012