Scala按位运算

时间:2013-11-12 16:25:30

标签: scala bit-manipulation

我正在定义一个简单的函数来执行一些按位操作:

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)

为什么我无法使用&运算符?我该如何解决这个错误?

3 个答案:

答案 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。