Дана логическая схема:
Задача состоит в том, чтобы посчитать сколько вариантов значений входных переменных при которых на ее выходе истина существует.
Я написал код:
#include <cstddef>
#include <bitset>
#include <iostream>
constexpr std::size_t INPUT_BITS_COUNT { 5 };
constexpr std::size_t VARIANTS_COUNT { 32 };
enum {
A = 0,
B = 1,
C = 2,
D = 3,
E = 4
};
bool check(const std::bitset<INPUT_BITS_COUNT> &bitset) {
const auto bOrD { bitset[B] | bitset[D] };
const auto cAndE { bitset[C] & bitset[E] };
const auto aOrBod { bitset[A] | bOrD };
const auto notEOrBod { ~(bitset[E] | bOrD) };
const auto caeAndAob { cAndE & aOrBod };
return caeAndAob | notEOrBod;
}
int main() {
std::bitset<INPUT_BITS_COUNT> inputBits;
inputBits.reset();
std::size_t counter { 0 };
for (std::size_t i { 0 }; i <= VARIANTS_COUNT; i++) {
inputBits = i;
if (check(inputBits))
counter++;
}
std::cout << counter;
}
Поясню: в первой строке цикла
i
побитово копируется в
inputBits
,
и безопасность такого копирования гарантируется тем, что
i
не больше 32 (11111 в двоичной системе счисления).
Функция
check
почему-то всегда возвращает
true
(может и нет),
поэтому программа выводит 33,
что неверно.