Scala 位运算

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)

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

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

在你的例子中,函数&接收作为参数(1 << i) != 0的结果,它是一个布尔值。在这种情况下,&函数需要一个整数。 - LuGo

5
运算符 & 的优先级与 && 相同,| 的优先级与 || 相同,因此您的表达式被评估的顺序与您的意图不同。请参见Scala规范的6.12.3节
&和|的优先级非常低,容易导致错误。一个好的工作习惯是始终在它们周围加括号。

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 !="可能会鼓励设置额外的一对括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接