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

Мне нужно написать функцию, которая принимает в качестве аргументов целое число, представляющее строку в таблице истинности, и логический массив, в котором хранятся значения для этой строки таблицы истинности.

Вот пример таблицы правды

Row| A | B | C |
1 | T | T | T |
2 | T | T | F |
3 | T | F | T |
4 | T | F | F |
5 | F | T | T |
6 | F | T | F |
7 | F | F | T |
8 | F | F | F |

Обратите внимание, что в данной таблице истинности может быть больше или меньше строк, чем в этой таблице, поскольку число возможных переменных может изменяться.

Прототип функции может выглядеть так

getRow(int rowNum, bool boolArr[]);

Если эта функция была вызвана, например, как

getRow(3, boolArr[])

Нужно вернуть массив со следующими элементами

|1|0|1|    (or |T|F|T|)

Сложность для меня возникает из-за того, что число переменных может меняться, поэтому увеличивается или уменьшается количество строк. Например, список переменных может быть A, B, C, D, E и F вместо просто A, B и C.

Я думаю, что лучшим решением было бы написать цикл, который считал бы до номера строки, и по существу изменил элементы массива, как он считал в двоичном виде. Чтобы

1st loop iteration, array elements are 0|0|...|0|1|
2nd loop iteration, array elements are 0|0|...|1|0|

Я не могу понять, как это сделать, и не могу найти решение в другом месте в Интернете. Извините за все замешательство и спасибо за помощь

1

Решение

Хорошо, теперь, когда вы переписали свой вопрос, чтобы быть более понятным. Первый, getRow необходимо принять дополнительный аргумент: количество бит. Строка 1 с 2 битами дает другой результат, чем строка 1 с 64 битами, поэтому нам нужен способ ее дифференцировать. Во-вторых, как правило, в C ++ все с нулевым индексом, поэтому я собираюсь сместить вашу таблицу истинности на одну строку, чтобы строка «0» возвращала все trues.

Ключевым моментом здесь является осознание того, что номер строки в двоичном формате — это то, что вам нужно Возьмите этот ряд (сдвинув 4 к 3):

3 | T | F | F |

3 в двоичном есть 011, который перевернут {true, false, false} — именно то, что вы хотите. Мы можем выразить это используя побитовый или как массив:

{!(3 | 0x4), !(3 | 0x2), !(3 | 0x1)}

Так что это просто вопрос записи в виде цикла:

void getRow(int rowNum, bool* arr, int nbits)
{
int mask = 1 << (nbits - 1);
for (int i = 0; i < nbits; ++i, mask >>= 1) {
arr[i] = !(rowNum & mask);
}
}
1

Другие решения


По вопросам рекламы [email protected]