Go語言學習(7) - 運算子

翻身碼農把歌唱發表於2019-01-05

運算子用於在程式執行時執行數學或邏輯運算。

Go語言內建的運算子有:

  • 算術運算子
  • 關係運算子
  • 邏輯運算子
  • 位運算子
  • 賦值運算子
  • 其他運算子

算術運算子

  • 算術運算子主要有:+、-、*、/、%(求餘)、++(自增)、--(自減)

關係運算子

  • 關係運算子主要有:==、!=、>、<、>=、<=

邏輯運算子

  • 邏輯運算子主要有:&&(邏輯AND)、|| (邏輯OR)、! (邏輯NOT)

位運算子

位運算子對整數在記憶體中的二進位制進行操作。

位運算子比一般的算術運算子速度要快,而且可以實現一些算術運算子不能實現的功能。如果要開發高效率程式,位運算子是必不可少的。位運算子用來對二進位制進行操作,包括:按位與(&)、按位或(|)、按位異或(^)、按位左移(<<)、按位右移(>>)

按位與

按位與(&):對兩個數進行操作,然後返回一個新的數,這個數的每個位都需要兩個輸入數的同一位都為1時 才為1。簡單的說:同一位同時為1 則為1

按位或

按位或(|):比較兩個數,然後返回一個新的數,這個數的每一位置設定1的條件是任意一個數的同一位為1 則為1。簡單的說:同一位其中一個為1 則為1

按位異或

按位異或(^):比較兩個數,然後返回一個數,這個數的每一位設為1的條件是兩個輸入數的同一位不同 則為1,如果相同就設為 0 。簡單的說:同一位不相同 則為1

左移運算子(<<)

按二進位制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零

  1. 語法格式:
    1. 需要移位的數字 << 移位的次數
    2. 例如:3 << 4,則是將 數字3 左移了4位
  2. 計算過程:
    1. 3 << 4
    2. 首先把 3 轉換為 二進位制數字 0000 0000 0000 0000 0000 0000 0000 0011,然後把該數字高位(左側)的兩個零移出。其他的數字都朝左平移4位,最後在 低位(右側)的兩個空位補零,則得到的最終結果為 0000 0000 0000 0000 0000 0000 0011 0000,則轉換為十進位制為 48
    3. 用 3 * 2 ^4 計算 更加方便,3 乘以 2 的4次方
  3. 數字意義
    1. 在數字沒有溢位的前提下,對於正數 和 負數,左移一位 都相當於 乘以 2的一次方,左移 n 位就相當於 乘以2的 n 次方
右移運算子(>>)

按二進位制形式把所有的數字都向右移動對應 位移位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數 補1

  1. 語法格式
    1. 需要移位的數字 >> 移位的次數
    2. 例如:11 >> 2,則是將數字 11 右移2位
  2. 計算過程
    1. 11的二進位制形式為:0000 0000 0000 0000 0000 0000 0000 1011,然後把低位的最後兩個數字移出,因為該數字是正數,所有在高位補零,則得到的最終結果為 0000 0000 0000 0000 0000 0000 0000 0010,轉化為十進位制為2
    2. 用 11 / (2 ^ 2) 計算 更加方便,11 除以 2 的2次方
  3. 數字意義
    1. 右移一位相當於 除2,右移 n 位,則相當於 除以2的 n 次方

賦值運算子

賦值運算子有:=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。

DEMO示例

以下是上面知識點的程式碼演示:

package main
import "fmt"

var a = 21.0
var b = 5.0
var c float64

func main() {
	fmt.Println("算術運算子 --- start---")
	Arithmetic()
	fmt.Println()

	fmt.Println("關係運算子 --- start---")
	Relational()
	fmt.Println()

	fmt.Println("邏輯運算子 --- start---")
	Logical()
	fmt.Println()

	fmt.Println("位運算子 --- start---")
	Bitwise()
	fmt.Println()

	fmt.Println("賦值運算子 --- start---")
	Assignment()
	fmt.Println()
}

// 算術運算子
func Arithmetic() {
	c = a + b
	fmt.Printf("第一行 - c 的值為 %.2f\n", c)

	c = a - b
	fmt.Printf("第二行 - c 的值為 %.2f\n", c)

	c = a * b
	fmt.Printf("第三行 - c 的值為 %.2f\n", c)

	c = a / b
	fmt.Printf("第四行 - c 的值為 %.2f\n", c)

	//c = a % b
	fmt.Printf("第五行 - c 的值為 %d\n", int(a)%int(b))

	a++
	fmt.Printf("第六行 - a 的值為 %f\n", a)

	a = 21
	a--
	fmt.Printf("第七行 - a 的值為 %f\n", a)
}

// 關係運算子
func Relational() {
	if (a == b) {
		fmt.Printf("第一行 - a 等於 b \n")
	} else {
		fmt.Printf("第一行 - a 不等於 b \n")
	}

	if (a < b) {
		fmt.Printf("第二行 - a 小於 b \n")
	} else {
		fmt.Printf("第二行 - a 不小於 b \n")
	}

	if (a > b) {
		fmt.Printf("第三行 - a 大於 b \n")
	} else {
		fmt.Printf("第三行 - a 不大於 b \n")
	}
}

// 邏輯運算子
func Logical() {

	a := true
	b := false

	if (a && b) {
		fmt.Printf("第一行 - 條件為 true \n")
	}
	if (a || b) {
		fmt.Printf("第二行 - 條件為 true \n")
	}
	if (!(a && b)) {
		fmt.Printf("第三行 - 條件為 true \n")
	}
}

// 位運算子
func Bitwise() {
	fmt.Println(252 & 63)
	fmt.Println(178 | 94)
	fmt.Println(20 ^ 5)
	fmt.Println(3 << 4)  // 3 * 2 ^ 4
	fmt.Println(11 >> 2) // 11 / (2 ^ 2)
}

// 賦值運算子
func Assignment() {
	c = a
	fmt.Printf("第1行 - =運算子例項,c的值為 %f \n", c)

	c += a
	fmt.Printf("第2行 - +=運算子例項,c的值為 %f \n", c)

	c -= a
	fmt.Printf("第3行 - -=運算子例項,c的值為 %f \n", c)

	c *= a
	fmt.Printf("第4行 - *=運算子例項,c的值為 %f \n", c)

	c /= a
	fmt.Printf("第5行 - /=運算子例項,c的值為 %f \n", c)

	c = a
	fmt.Printf("第6行 - =運算子例項,c的值為 %f \n", c)

	d := 200
	d <<= 2
	fmt.Printf("第7行 - <<=運算子例項,d的值為 %d \n", d)  // d = d * 2^2 = 200 * 2^2 = 800

	d >>= 2
	fmt.Printf("第8行 - >>=運算子例項,d的值為 %d \n", d)  // d = d / (2^2) = 800 / (2^2) = 200

	d &= 2
	fmt.Printf("第9行 - &=運算子例項,d的值為 %d \n", d)	// d = d & 2 = 0

	d |= 2
	fmt.Printf("第10行 - |=運算子例項,d的值為 %d \n", d) // d = d | 2 = 2

	d ^= 2
	fmt.Printf("第11行 - ^=運算子例項,d的值為 %d \n", d) // d = d ^ 2 = 0
}
複製程式碼

執行結果為:

算術運算子 --- start---
第一行 - c 的值為 26.00
第二行 - c 的值為 16.00
第三行 - c 的值為 105.00
第四行 - c 的值為 4.20
第五行 - c 的值為 1
第六行 - a 的值為 22.000000
第七行 - a 的值為 20.000000

關係運算子 --- start---
第一行 - a 不等於 b 
第二行 - a 不小於 b 
第三行 - a 大於 b 

邏輯運算子 --- start---
第二行 - 條件為 true 
第三行 - 條件為 true 

位運算子 --- start---
60
254
17
48
2

賦值運算子 --- start---
第1行 - =運算子例項,c的值為 20.000000 
第2行 - +=運算子例項,c的值為 40.000000 
第3行 - -=運算子例項,c的值為 20.000000 
第4行 - *=運算子例項,c的值為 400.000000 
第5行 - /=運算子例項,c的值為 20.000000 
第6行 - =運算子例項,c的值為 20.000000 
第7行 - <<=運算子例項,d的值為 800 
第8行 - >>=運算子例項,d的值為 200 
第9行 - &=運算子例項,d的值為 0 
第10行 - |=運算子例項,d的值為 2 
第11行 - ^=運算子例項,d的值為 0 
複製程式碼

歡迎關注我的公眾號~ 搜尋公眾號: 翻身碼農把歌唱 或者 掃描下方二維碼:

img

相關文章