我是scala的新手并且正在尝试访问scala not运算符。我知道我可以使用' - '逻辑NOT运算的运算符。但有时这个算子给了我一个否定的答案,如(-1)
例如:
val x = 1
val y =(~x)
这里的值y给我一个-1而不是一个0.但是我需要一个1或0形式的答案。有人可以告诉我,我在这里缺少什么? 感谢您的帮助。
答案 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