2013-01-16 2 views
1

나는이 표현을 평가하기 위해 노력하고있어 자바에서 자바 스크립트 표현을위한 올바르지 않습니다.반환 값 유형으로 인해 XOR의 비트^연산자

"ture && false || false (true || false && true || false XOR true)" 

모든 :

String expr = "0x1^0x0"; String expr = "1^0";

는 기본적으로 I는 다음과 같이 수있는 다양한 표현을 평가하기 위해 자바 스크립트 엔진을 사용할 수 있도록하려면 : 나는 문자열 EXPR 등 다양한 옵션을 시도 다른 연산자는 & & 또는 || 표현식을 평가하고 불리언을 반환하면 잘 작동하지만 XOR (JavaScript와 동등한 bitwise^연산자가 있음) 일 때는 Double을 반환합니다. XOR을 일부 논리 연산자 (예 : (true || false) & &! (true & & false))로 바꾸는 표현식을 변환하고 싶지는 않습니다. 왜냐하면 전체 식 문자열을 다음과 같이 구문 분석해야하기 때문입니다. XOR을 위의 논리 표현식으로 변환하십시오. 이 표현을 평가하는 요점은 그 복잡성을 파싱하지 않고도 평가할 수 있다는 것입니다.

도움이 될 것입니다. 미리 감사드립니다!

+0

죄송합니다. 원본 표현식을 읽어야합니다. String expr = "true^true"; – azm882

+0

질문을 편집하십시오. 아래에는 '편집'링크가 있습니다. ;-) –

답변

0

XOR을 사용하는 대신 !=을 쓰는 것이 더 자연 스럽습니다. true != false 이것이 Javascript에서 작동하지 않으면 놀랄 것입니다.

당신은 이중 부정 사용하는 자바 스크립트 코드에 불리언으로 캐스트를 강제 할 수
+0

@archer Javascript에는 XOR이 없으므로 javascript에있는 내용으로 변환해야합니다. –

+0

JS를 잘 모르지만 비트 연산에서 double을 얻는 것은 약간 미친 짓입니다. ;) –

+1

JS가 비트 XOR을 수행하기 전에 Number로 부울 값을 반환하는 것 같습니다. 따라서 Double을 반환하는 것입니다. – Archer

1

:

Boolean obj = (Boolean) scriptEngine.eval("!!(" + expr + ")"); 
2

여기에서 인용이 : http://www.howtocreate.co.uk/xor.html

"불행하게도, 자바 스크립트는 논리적 XOR 연산자가없는이 있습니다. 두 숫자의 비트 비교를 수행 할 수있는 비트 XOR 연산자 ^는 숫자를 반환하지 않는 두 표현식의 XOR 결과를 얻고 자 할 때 도움이되지 않습니다.

XOR 연산자는 b 즉이로 시뮬레이션이 사용

if((foo && !bar) || (!foo && bar)) { 
    ... 
} 

또는 1 개 적은 동작으로 (푸 바의 값에 따라)

if((foo || bar) && !(foo && bar)) { 
    ... 
} 

또는 삼원 연산자를 사용은 더 작은하기 :

if(foo ? !bar : bar) { 
    ... 
} 
+0

또한'! =' –

+0

디에고와 함께 부울에 대해 시뮬레이션 할 수 있습니다. 감사합니다. 그러나 제가 언급 한 것처럼 그것은 제 문제를 해결하지 못할 것입니다. – azm882

+0

그런데 왜 JavaScript 엔진을 사용하고 있습니까? 이 질문을보십시오 : http://stackoverflow.com/questions/12203003/boolean-expression-parser-in-java –

0
나는 명확한 대안의 부재에이 솔루션을 구현하고있어

:

boolean useDouble = false; 
    String expr = "true^false"; 
    if(expr.contains("^")) 
    { 
     useDouble = true; 
    } 
      ... 
      if(useDouble) 
     { 
      Double d = (Double) scriptEngine.eval(expr); 
      boolean r = (d != 0.0); 
      System.out.println(" result: " + r); 
     } 
     else 
     { 
      Boolean b = (Boolean)scriptEngine.equals(expr); 
      System.out.println(b.getClass().getName() + "result:" + b); 
     }