Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于XOR按位^operator,Java中JavaScript表达式的返回值类型不正确_Java_Javascript_Bit Manipulation_Xor_Scriptengine - Fatal编程技术网

由于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引擎呢?看看这个问题: