Для оперирования логическими (булевскими) значениями предназначен тип bool. Множество значений этого типа состоит из двух элементов: false и true.
Логика | C++ | Смысл |
---|---|---|
0 | false | ложь |
1 | true | истина |
Для булевских значений язык C++ предоставляет три операции: отрицание (“не”) !, конъюнкция (“и”) && и дизъюнкция (“или”) ||.
Ниже приведены таблицы истинности этих операций.
Не, a |
0 |
1 |
---|---|---|
!a |
1 |
0 |
И, && |
0 |
1 |
---|---|---|
0 |
0 |
0 |
1 |
0 |
1 |
Или, || |
0 |
1 |
---|---|---|
0 |
0 |
1 |
1 |
1 |
1 |
Операция “исключающее или” (xor) соответствует ситуации “или-или”:
Xor | 0 |
1 |
---|---|---|
0 |
0 |
1 |
1 |
1 |
0 |
Отрицание “исключающего или” даёт операцию, известную как “эквиваленция”:
Xnor | 0 |
1 |
---|---|---|
0 |
1 |
0 |
1 |
0 |
1 |
Реализовать и протестировать функцию xor
. Использовать операции !
, &&
, ||
.
Реализовать и протестировать функцию xnor
. Использовать операции !
, &&
, ||
.
Операции “и-не” (not and, nand) и “или-не” (not or, nor) могут быть получены из “и” и “или” отрицанием.
Nand | 0 |
1 |
---|---|---|
0 |
1 |
1 |
1 |
1 |
0 |
bool nand(bool a, bool b)
{
return !(a && b);
}
Nor | 0 |
1 |
---|---|---|
0 |
1 |
0 |
1 |
0 |
0 |
bool nor(bool a, bool b)
{
return !(a || b);
}
Nand и nor замечательны тем, что каждая из них образует базис всего множества возможных булевских операций. Например, реализовать через nand/nor отрицание очень легко:
bool nand_not(bool a) { return nand(a, a); }
bool nor_not(bool a) { return nor(a, a); }
Теперь не составит труда реализовать “или” (or) через nor и “и” (and) через nand:
bool nand_and(bool a, bool b)
{
return nand_not(nand(a, b));
}
bool nor_or(bool a, bool b)
{
return nor_not(nor(a, b));
}
Чтобы убедиться в корректности данных функций, можно составить простую тестировочную программу, выводящую таблицу истинности. Например, для nor_or
:
int main()
{
cout << nor_or(false, false) << ' ' << nor_or(false, true) << '\n';
cout << nor_or(true, false) << ' ' << nor_or(true, true) << endl;
return 0;
}
Реализовать и протестировать функцию nand_or
(реализация or через nand).
Реализовать и протестировать функцию nor_and
(реализация and через nor).
Кувшинов Д.Р. © 2016