Лучше найти, являются ли обе переменные истинными или ложными - PullRequest
19 голосов
/ 28 марта 2011

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

Теперь мне нужно установить другую переменную, которая будет true или false. это будет истинное значение, когда обе переменные равны true или обе являются ложными. Это будет ложное значение, одно из которых истинно, а другое ложно.

в настоящее время я забочусь об этом, используя выражение if

if ( v1 == true && v2 == true )
 result = true;
else if ( v1==false && v2 == false )
 result = true;
else if ( v1 == true && v2 == false )
 result = false;
else if ( v1==false && v2 == true )
 result = false;

Существует ли лучший способ сделать это?

Ответы [ 7 ]

112 голосов
/ 28 марта 2011

Я могу упустить что-то очень фундаментальное, но я попробую:

result = ( v1 == v2 );
13 голосов
/ 28 марта 2011

Вы можете использовать логический оператор XOR и логический оператор NOT как:

result = !(v1^v2);
5 голосов
/ 28 марта 2011

Проблема такого рода, учитывая таблицу истинности, минимизирующую логику, необходимую для воспроизведения значений истинности, часто хорошо обрабатывается с помощью Karnaugh Maps

Ваша таблица истинности здесь выглядит следующим образом:

 v1 v2  f(v1, v2)
  t  t     t
  t  f     f
  f  t     f
  f  f     t

И на самом деле, как уже отмечали другие, учитывая, что таблица истинности, базовое знакомство с логикой должно сразу привести к функции! xor

Однако, есливы берете таблицу истинности и рисуете ее как карту Карно, она выглядит следующим образом:


        v2
       f   t 
     ---------
 v  f| t | f |
 1  t| f | t |
     ---------

И функция выглядит так:! v1! v2 ||v1v2, который, если вы посмотрите на 2 примера карты переменных Карно , снова можно увидеть, чтобы упростить до! xor

По общему признанию, две переменные карты Карно, вероятно, лучше всего обрабатываются обычными логическими операциями с помощью скважины, знакомства и запоминания.Но при расширении за пределы двух переменных карты Карно очень ярки - вы должны посмотреть на них.

2 голосов
/ 28 марта 2011

Используйте оператор XOR (^):

boolean result = !(v1 ^ v2)
0 голосов
/ 28 марта 2011

Простой способ состоит в том, что если две переменные равны, то это должно быть истиной, а если любая из них ложна, то ложна. отметьте это.

if(v1 == v2)
    return true;
else 
    return false;
0 голосов
/ 28 марта 2011
if(v1 == v2) 
return true; 
else 
return false;
0 голосов
/ 28 марта 2011

Почему бы просто не сравнить два?

if(v1 == v2) result = true;
...