2012-04-24 77 views
0

我尝试了按位运算符建议的to my questionhere后续工作:检查两个整数是否具有相同的符号

检查我的测试套件的结果:

function equal(n1,n2){ 
    var bool = (n1^n2 >= 0)?true:false; 
    document.write("<div>"+bool+" ("+(n1^n2)+")</div>"); 
} 


equal(-5,-2); //true 
equal(-4,-20); //true 
equal(15,-2); //false 
equal(25,3); //true 

equal(-1,1); //false 
equal(1,1); //true 
equal(-1,-1); //true 

// edgecases 
equal(0,0); 
equal(-0,0); 
equal(+0,0); 
equal(-0,+0); 
equal(+0,-0); 

结果:

true (5) 
true (16) 
true (-15) 
true (26) 

true (-2) 
false (0) 
true (0) 

true (0) 
true (0) 
true (0) 
true (0) 
true (0) 

我根据fiddle is here

结果让我非常困惑。我太笨了吗?这里发生了什么?

+0

你不愚蠢,JavaScript有一些非常有趣的行为,数字接近零。阅读此:http://www.2ality.com/2012/03/signedzero.html – 2012-04-24 15:07:48

回答

1

你有错地方的括号:

function equal(n1, n2){ 
    var bool = (n1^n2) >= 0 ? true : false; 
    document.write("<div>" + bool + " (" + (n1^n2) + ")</div>"); 
} 

这里有一个结果匹配updated fiddle你所期望的。

这在这种情况下很重要,因为所有的位运算符都是lower precedence而不是关系比较运算符。还请注意,条件运算符(?:)的优先级低于所有按位运算符,因此不需要在整个条件周围使用另一组括号。

+0

啊,该死的运营商绑定^^ TY非常。 – Christoph 2012-04-24 15:08:58

+0

没问题,很高兴我可以帮助:) – 2012-04-24 15:12:08

相关问题