一. Scala的位运算符
常用的位运算符如下:
1. & 按位与运算符。0&1 = 0, 1&0= 0 , 0&0 = 0, 1&1 = 1
4&5 ---> 4
4 -> 1 0 0
5 -> 1 0 1
&------------
1 0 0 (4)
2. | 按位或运算符。0|1 = 1, 1|0= 1 , 0|0 = 0, 1|1 = 1
4|5 ----> 5
4 → 1 0 0
5 → 1 0 1
---------
1 0 1 (5)
3. ^ 按位异或运算符。0^1 = 1, 1^1= 0, 0^0 = 0
4. ~ 按位取反运算符
5. << 左移运算符。右边补零,放大。
6. >> 右移运算符。左边补零,缩小。
object Base09 {
def main(args: Array[String]): Unit = {
// 位运算:把10进制的数转二进制显示,其中的某个数字
/* *
* 10进制 2进制
* 0 0
* 1 1
* 2 10
* 3 11
* 4 100
* 5 101
* 6 110
*
*/
println(s"4|5=${ 4|5 }")
println(s"6&2=${ 6&2 }")
println(s"6|2=${ 6|2 }")
}
}
结果如图:
二. Scala中运算符的优先级
基本规则:
1. 乘(*)除(/)模(%) > 加(+)减(-)
2. 算术(+-*/%) > 关系(><>=!=) > 赋值(=)
3. && > ||
object Base10 {
def main(args: Array[String]): Unit = {
val result = 10 - 2 + 3 * 4 / 2
println(result)
val a = true
val b = false
val c = false
/** && 的优先级要高于 || */
println(a || b && c)
}
}
结果如图:
三. Scala的相等性
在Scala中,有两种方式:
1. == 比较的对象只有数值,只要==两边的值相等,就返回true。
2. eq 引用比较
四. Scala中的自增和自减运算
在Scala中没有++和--这样的自增和自减运算符。
那么要想在Scala中实现类似于Java中的自增和自减运算,可以使用如下的赋值运算符进行替代。
++:用赋值运算符 +=1代替++。
--:用赋值运算符 -=1代替--。
五. 浮点数精度问题
由于精度的问题,小数的计算会存在误差。
解决方案:使用BigDecimal()函数。
object Base11 {
def main(args: Array[String]): Unit = {
val a = 0.1
val b = 0.2
val c = 0.3
println( a + b == c ) // false
println(1 + 2 == 3) // true
println(0.1 + 0.2 == 0.3) // false
println( BigDecimal(0.1) + BigDecimal(0.2) == BigDecimal(0.3) ) // ture
println(0.1 + 0.1 == 0.2) // true
}
}
结果如图:
六. 大数问题
一种整数都有自己的表达范围,例如Int类型的最大值是2147483647,一旦超过了这个范围就会报错,或者是导致计算异常。
object Base12 {
def main(args: Array[String]): Unit = {
val a = 2147483647
val b = 1
val c1 = (a + b) / 2 //Bug
// 小技巧:另一种计算平均值的方法: a - (a-b)/2
val c2 = a - (a-b) / 2
println(c1)
println(c2)
}
}
结果如图:
用BigInt(数字字符串)来解决这个问题
object Base12 {
def main(args: Array[String]): Unit = {
//大数字计算
// 111111111111111111111*222222222222222222222
val a:Double =111111111111111111111.1*222222222222222222222.2
val b = BigInt("111111111111111111111") * BigInt("222222222222222222222")
println(a)
println(b)
}
}
结果如图: