我正在对scala位操作进行一些研究,如下所示:
scala> val b = 8
b: Int = 8
scala> var c:Int = b | (1<<4)
c: Int = 24
scala> var c:Int = c | (1<<5)
c: Int = 32
我不明白为什么从b到c赋值时结果看起来正确但从c到自身时看起来不正确。第3个陈述的期望结果是56。谁知道为什么?
答案 0 :(得分:2)
在第三行中,您将重新定义变量c
。 REPL显然以这样的方式工作:它首先创建设置为其默认值0
的变量,然后设置为0 | (1 << 5)
,即32。
解决方案:不要重新定义变量c
,只需重新分配它:
scala> val b = 8
b: Int = 8
scala> var c: Int = b | (1 << 4)
c: Int = 24
scala> c = c | (1 << 5) // Don't redefine c, just reassign it
c: Int = 56
在&#34;真实&#34;程序(不在REPL中)您不能在同一范围内多次定义同一个同名变量。如果您尝试重新定义变量c
,则会收到编译器错误。
答案 1 :(得分:0)
因为您正在使用repl,所以您正在重新调整变量c。所以就行了
var c:Int = c | (1<<5)
是
的等同物var c:Int = 0 | (1<<5)
哪个是32.如果你使用像d这样的新变量,那么你会得到56,就像你期望的那样。