05基本运算

57 阅读2分钟

一. 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
  41 0 0
  51 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 }")
    
  }

}

结果如图:

屏幕截图 2025-09-17 090545.png

二. 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) 
 }

}

结果如图:

屏幕截图 2025-09-17 092730.png

三. 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
  }

}

结果如图:

屏幕截图 2025-09-17 102747.png

六. 大数问题

一种整数都有自己的表达范围,例如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)

  }

}

结果如图:

屏幕截图 2025-09-17 101645.png

用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)

  }

}

结果如图:

屏幕截图 2025-09-17 102042.png