Лабораторная работа 2: булевские операции

Кувшинов Д.Р.

2016


Общее оглавление


Основные определения

Для оперирования логическими (булевскими) значениями предназначен тип 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

Задание 1

Вариант 1

Реализовать и протестировать функцию xor. Использовать операции !, &&, ||.

Вариант 2

Реализовать и протестировать функцию 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;
}

Задание 2

Вариант 1

Реализовать и протестировать функцию nand_or (реализация or через nand).

Вариант 2

Реализовать и протестировать функцию nor_and (реализация and через nor).


Общее оглавление

Кувшинов Д.Р. © 2016