4

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

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)

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

4

3 回答 3

6

以下代码应该可以工作: def getBit(num:Int, i:Int):Boolean = ((num & (1 << i)) != 0)

于 2013-11-12T16:28:54.763 回答
5

运算符 & 与 && 和 | 具有相同的优先级 与 || 具有相同的优先级,因此您的表达式的计算顺序与您预期的顺序不同。请参阅Scala 规范的第 6.12.3 节。

& 和 | 的优先级 是非直观的低,并且是错误的常见来源。一个好的工作习惯是总是在它们周围加上括号。

于 2013-11-12T16:41:47.613 回答
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!=”可能会鼓励设置额外的一对括号。

于 2020-12-15T04:30:04.983 回答