为什么使用'〜' scala中的运算符给出了负值

时间:2016-04-19 13:14:03

标签: scala logical-operators

我是scala的新手并且正在尝试访问scala not运算符。我知道我可以使用' - '逻辑NOT运算的运算符。但有时这个算子给了我一个否定的答案,如(-1)

例如:

 val x = 1
 val y =(~x)

这里的值y给我一个-1而不是一个0.但是我需要一个1或0形式的答案。有人可以告诉我,我在这里缺少什么? 感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

与许多其他语言不同,Scala不支持在需要布尔值的上下文中使用数字或其他类型的值。例如,以下行中没有一行编译:

if (1) "foo" else "bar"
if ("1") "foo" else "bar"
if (List(1)) "foo" else "bar"

有些语言有一个“真实性”的概念,这里用来确定条件是否成立,但Scala没有 - 如果你想要一个布尔值,你需要使用Boolean

这意味着普通的逻辑否定对数字没有意义,~是完全不同的东西 - 它给你按位否定,这不是你想要的。相反,你似乎想要这样的东西:

val x = 1
val nonzeroX = x != 0
val y = !nonzeroX

即,您明确地将您的数字转换为布尔值,然后使用标准逻辑否定(!)来处理它。

答案 1 :(得分:3)

~是按位否定,即它占用给定数字的每一位并取消它,将每个0位变为1位,每个1位变为0位。由于有符号数的第一位表示其符号(0表示正数,1表示负数),这会导致正数而零则变为负数(反之亦然)。

如果您想要简单的逻辑否定,只需使用布尔值和!

PS:请注意,在您发布的代码中,y的值将为-2,而不是您在帖子中写的-1

答案 2 :(得分:2)

如果您只想将其从0转换为1,反之亦然,则可以使用^(XOR)运算符。

val x = 1
val y = 1^x