2012-09-06 9 views
6

Dane:Co robi bitowe wyłączne LUB robi w Javie?

public class Spock { 
    public static void main(String[] args) { 
     Long tail = 2000L; 
     Long distance = 1999L; 
     Long story = 1000L; 
     if ((tail > distance)^((story * 2) == tail)) { 
      System.out.print("1"); 
     } 
     if ((distance + 1 != tail)^((story * 2) == distance)) { 
      System.out.print("2"); 
     } 
    } 
} 

Dlaczego ten przykładowy kod nie robi nic wyjściowego?

Odpowiedz

11

W pierwszym, jeśli uzyska true^true = false
W sekund, jeśli uzyska false^false = false
poniewaz ^ - jest OR exclusive opeartor, to znaczy

true^true = false 
true^false = true 
false^true = true 
false^false = false 
+0

Więc można myśleć o tym, jak to wtedy. Jeśli True reprezentuje wartość dodatnią, a Fałsz oznacza wartość ujemną, to ujemne razy wartość dodatnia równa się wartości dodatniej, ujemna razy wartość ujemna równa się wartości ujemnej, a wartość dodatnia - wartość dodatnia równa się wartości ujemnej ... jest całkowicie odwrotna :) –

8

Używasz boolean exclusive LUB i jest to bardzo podobne do !=. W pierwszym przypadku oba warunki są prawdziwe, aw drugim oba warunki są fałszywe, więc nie brana jest żadna gałąź. (Można to sprawdzić z debuggera w swoim IDE)

Jedyną różnicą jest to, że != ma wyższy priorytet niż & która jest wyższa niż ^

1

To nic nie drukować, ponieważ gdy operator XOR jest używany z logicznych argumentów (w przeciwieństwie do liczb całkowitych) będzie tylko powrót true jeśli dokładnie jeden z argumentów jest true 2.

W pierwszych if obu częściach ocenić na true i true^true == false

w drugim if obu częściach ocenić na false i false^false == false