由于XOR按位^operator,Java中JavaScript表达式的返回值类型不正确
我试图计算这个表达式:由于XOR按位^operator,Java中JavaScript表达式的返回值类型不正确,java,javascript,bit-manipulation,xor,scriptengine,Java,Javascript,Bit Manipulation,Xor,Scriptengine,我试图计算这个表达式: ScriptEngineManager sem = new ScriptEngineManager () ScriptEngine scriptEngine = sem.getEngineByName("js") ; String expr = "true ^ true"; Boolean obj = (Boolean) scriptEngine.eval(expr); 但是,返回的结果是java Double。我尝试了各种字符串表达式选项,例如: String ex
ScriptEngineManager sem = new ScriptEngineManager ()
ScriptEngine scriptEngine = sem.getEngineByName("js") ;
String expr = "true ^ true";
Boolean obj = (Boolean) scriptEngine.eval(expr);
但是,返回的结果是java Double。我尝试了各种字符串表达式选项,例如:
String expr=“0x1^0x0”代码>
String expr=“1^0”代码>
基本上,我希望能够使用JavaScript引擎计算各种表达式,这些表达式可能如下所示:
"ture && false || false (true || false && true || false XOR true)"
当我对这些表达式求值并返回布尔值时,所有其他运算符(如&&或| |)都可以正常工作,但当它使用XOR(具有JavaScript等效的按位^operator)时,它返回Double。我真的不想将表达式转换为某些逻辑运算符(例如((true | | false)&&&!(true&&false)),因为这样我就必须解析整个表达式字符串,才能将XOR转换为上述逻辑表达式。我对这个表达式求值的全部意义在于,我能够在不解析其复杂性的情况下进行求值
任何帮助都将不胜感激!提前谢谢 编写比使用XOR更自然=代码>例如true!=false
如果这在Javascript中不起作用,我会感到惊讶。您可以在Javascript代码中使用双重否定强制转换为布尔值:
Boolean obj = (Boolean) scriptEngine.eval("!!(" + expr + ")");
从这里引述:
“不幸的是,JavaScript没有逻辑异或运算符。它有一个按位异或运算符^,可以对两个数字执行按位比较,但当您希望获得两个表达式的异或结果时,这没有帮助,因为这两个表达式不返回数字。”
可以使用以下方法模拟XOR运算符:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
if( ( foo || bar ) && !( foo && bar ) ) {
...
}
或者使用以下方法进行一次操作(取决于foo和bar的值):
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
if( ( foo || bar ) && !( foo && bar ) ) {
...
}
或者使用三元运算符使其更小:
if( foo ? !bar : bar ) {
...
}
我在没有任何明确替代方案的情况下实施此解决方案:
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);
}
抱歉,原始表达式应为:String expr=“true^true";编辑你的问题。底部有一个edit
链接@archer Javascript没有XOR,所以您必须将其转换为Javascript确实具有的功能。我对JS不太了解,但从逐位操作中获得一个double有点疯狂似乎JS在按位异或之前将布尔值转换为数字,这就是它返回双精度的原因。它也可以用模拟布尔值=代码>迭戈,谢谢,但就像我提到的那样,它不能解决我的问题。那你为什么要使用JavaScript引擎呢?看看这个问题: