我正在定义一个简单的函数来执行一些按位操作:
def getBit(num:Int, i:Int):Boolean = (num & (1 << i) != 0)
但是我收到了这个错误:
<console>:7: error: overloaded method value & with alternatives:
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (Boolean)
def getBit(num:Int, i:Int):Boolean = (num & (1 << i) != 0)
为什么我无法使用&
运算符?我该如何解决这个错误?
答案 0 :(得分:6)
以下代码应该有效:
def getBit(num:Int, i:Int):Boolean = ((num & (1 << i)) != 0)
答案 1 :(得分:4)
运营商&amp;具有与&amp;&amp;和|相同的优先级与||具有相同的优先级,因此您的表达式的计算顺序与您预期的顺序不同。见the Scala spec的第6.12.3节。
&amp;的优先顺序和|非直观地低,并且是错误的常见来源。一个良好的工作习惯是始终围绕它们括起来。
答案 2 :(得分:0)
如果将比较部分“ 0!=“放在前面,就可以摆脱问题:
def getBit (num: Int, i: Int): Boolean = (0 != (num & (1 << i)))
当然,真正的原因是附加括号,与其他建议的答案一样。这也不会编译:
def getBit (num: Int, i: Int): Boolean = (0 != num & (1 << i))
但是前面的“ 0!=”可能会鼓励设置另外一对parens。