2016-09-28 53 views
1

我做的阶位操作如下一些研究:斯卡拉位操作

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到本身。第三项声明的预期结果为56。任何人都知道为什么?

回答

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 

在“真实”程序中(不在REPL中),不能在同一范围内多次使用相同名称定义相同的变量。如果您尝试重新定义变量c,则会出现编译器错误。

+0

非常感谢你Jesper! – Lionel

0

因为您使用的是repl,所以您正在重写变量c。所以上线

var c:Int = c | (1<<5) 

这是

var c:Int = 0 | (1<<5) 

的equivilant这是32如果你使用像d一个新的变量,那么你获得56如你所愿。

+0

谢谢凯文! – Lionel