Scala位操作

时间:2016-09-28 10:18:01

标签: scala byte bit

我正在对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。谁知道为什么?

2 个答案:

答案 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,就像你期望的那样。