Golang 运算符

运算符介绍

运算符的相关介绍

  1. 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

    • 算术运算符
    • 赋值运算符
    • 比较运算符/关系运算符
    • 逻辑运算符
    • 位运算符
    • 其他运算符

      算术运算符

  2. 算术运算符是对数值型变量进行运算的,比如:加减乘除。

  3. 算术运算符一览 | 运算符 | 运算 | 范例 | 结果 | | —- | —- | —- | —- | | + | 正号 | +3 | 3 | | - | 负号 | -4 | -4 | | + | 加 | 5 + 5 | 10 | | - | 减 | 6 - 4 | 2 | | | 乘 | 3 4 | 12 | | / | 除 | 5 / 5 | 1 | | % | 取模(取余) | 7 % 5 | 2 | | ++ | 自增 | a = 2 a++ | a=3 | | — | 自减 | a = 2 a— | a=1 | | + | 字符串 | “He” + “llo” | “Hello” |

  4. 除法使用的特点 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { //重点讲解 /、% //说明:如果参与运算的数都是整数,那么除后,去掉小数部分,保留整数部分。 fmt.Println(10 / 4) // 2.5 var n1 float32 = 10 / 4 fmt.Println(n1)

  1. //如果我们希望保留小数部分,则需要有浮点数参与运算。
  2. var n2 float32 = 10.0 / 4
  3. fmt.Println(n2)

}

  1. 4. 取模使用特点
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. func main() {
  6. //演示 % 的使用
  7. //看一个公式 a % b = a - a / b * b
  8. fmt.Println("10 % 3 =", 10 % 3) // =1
  9. fmt.Println("-10 % 3 =", -10 % 3) // = -10 - (-10) / 3 * 3 = -1
  10. fmt.Println("10 % -3 =", 10 % -3) // = 10 - (10) / (-3) * (-3) = 1
  11. fmt.Println("-10 % -3 =", -10 % -3) // = (-10) - (-10) / (-3) * (-3) = -1
  12. }
  1. 自增、自减运算符使用特点 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { // ++ 和 — 的使用 var i int = 10 i++ // 等价 i = i + 1 fmt.Println(“i =”,i) i— // 等价 i = i - 1 fmt.Println(“i =”,i) }

  1. <a name="tAqx5"></a>
  2. #### 算术运算符的细节说明
  3. 1. 对于除号 / ,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:x := 19 / 5,结果是 3 。
  4. 1. 当对一个数取模时,可以等价 a % b = a - a / b * b,这样我们可以看到取模的一个本质运算。
  5. 1. Golang 的自增自减只能当做一个独立语言使用,不能这样使用:b := a++ 或者 b := a-- 。
  6. ```go
  7. package main
  8. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  9. func main() {
  10. //在 Golang 中,++ 和 -- 只能独立使用。
  11. var i int = 8
  12. var a int
  13. var b int
  14. // a = i++ //错误,i++ 只能独立使用。
  15. // a = i-- //错误,i-- 只能独立使用。
  16. i++
  17. a = i
  18. fmt.Println(a)
  19. i--
  20. b = i
  21. fmt.Println(b)
  22. }
  1. Golang 的 ++ 和 — 只能写在变量的前面,即:只有 a++ a— 没有 ++a —a 。 ```go package main

import “fmt” // fmt 包中提供格式化,输出,输入的函数

func main() { //在 Golang 中,++ 和 — 只能独立使用。 var i int = 8 var a int var b int // a = i++ //错误,i++ 只能独立使用。 // a = i— //错误,i— 只能独立使用。 i++ a = i fmt.Println(a) i— b = i fmt.Println(b)

  1. //Golang 的 ++ 和 -- 只能写在变量的前面
  2. var j int = 1
  3. j++
  4. //++j 错误
  5. //--j 错误
  6. fmt.Println("j =", j)

}

  1. 5. Golang 的设计者去掉 C/Java 中自增自减的容易混淆的写法,让 Golang 更加简洁,统一(强制性的)。
  2. 5. 相关练习
  3. ```go
  4. package main
  5. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  6. func main() {
  7. //假如还有97天放假,问:XX个星期零XX天
  8. var days int = 97
  9. var week int = days / 7
  10. var day int = days % 7
  11. fmt.Printf("%d 个星期零 %d 天 \n", week, day)
  12. //定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5.0 / 9 * (华氏温度 - 100),请求出华氏温度对应的摄氏温度。
  13. var huashi float32 = 134.2
  14. var sheshi float32 = 5.0 / 9 * (huashi - 100)
  15. fmt.Printf("华氏温度:%v 对应的摄氏温度:%v \n", huashi, sheshi)
  16. }

关系运算符(比较运算符)

关系运算符的基本介绍

  1. 关系运算符的结果都是 bool 型,也就是要么是 true ,要么是 false 。
  2. 关系表达式经常用在 if 结构的条件中或循环结果的条件中。

    关系运算符一览

    | 运算符 | 运算 | 范例 | 结果 | | —- | —- | —- | —- | | == | 相等于 | 4 == 3 | false | | != | 不等于 | 4 != 3 | true | | < | 小于 | 4 < 3 | false | | > | 大于 | 4 > 3 | true | | <= | 小于等于 | 4 <= 3 | false | | >= | 大于等于 | 4 >= 3 | true |

案例演示

  1. package main
  2. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  3. func main() {
  4. //演示关系运算符的使用
  5. var n1 int = 9
  6. var n2 int = 8
  7. fmt.Println(n1 == n2) // false
  8. fmt.Println(n1 != n2) // true
  9. fmt.Println(n1 > n2) // true
  10. fmt.Println(n1 >= n2) // true
  11. fmt.Println(n1 < n2) // false
  12. fmt.Println(n1 <= n2) // false
  13. flag := n1 > n2
  14. fmt.Println("flag =", flag)
  15. }

关系运算符细节说明

  1. 关系运算符的结果都是 bool 型,也就是要么是 true,要么是 false 。
  2. 关系运算符责成的表达式,我们称为关系表达式: a > b
  3. 比较运算符 == 不能误写成 = 。

    逻辑运算符

    基本介绍

  4. 用于连接多个条件(一般来讲就是关系表达式),最终结果也是一个 bool 值。

    逻辑运算符一览

  5. 假定 A 值为 True ,B 值为 False 。 | 运算符 | 描述 | 实例 | | —- | —- | —- | | && | 逻辑与运算符。如果两边的操作都是 True,则为 True,否则为 false 。 | (A && B) 为 False | | || | 逻辑或运算符。如果两边的操作数有一个 True,则为 True,否则为 False 。 | (A || B) 为 True | | ! | 逻辑非运算符。如果条件为 True ,则逻辑非为 False ,否则为 True | !(A && B) 为 True |

相关案例

  1. package main
  2. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  3. func main() {
  4. //演示逻辑运算符的使用 &&
  5. var age int = 40
  6. if age > 30 && age < 50 {
  7. fmt.Println("ok1")
  8. }
  9. if age > 30 && age < 40 {
  10. fmt.Println("ok2")
  11. }
  12. //演示逻辑运算符的使用 ||
  13. if age > 30 || age < 50 {
  14. fmt.Println("ok3")
  15. }
  16. if age > 30 || age < 40 {
  17. fmt.Println("ok4")
  18. }
  19. //演示逻辑运算符的使用 !
  20. if age > 30 {
  21. fmt.Println("ok5")
  22. }
  23. if !(age > 30) {
  24. fmt.Println("ok6")
  25. }
  26. }

逻辑运算符注意事项和细节说明

  1. && 也叫短路与:如果第一个条件为 false ,则第二个条件不会判断,最终结果为 false 。 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

//声明一个函数(测试) func test() bool{ fmt.Println(“test…”) return true }

func main() {

  1. var i int = 10
  2. if i < 9 && test() {
  3. fmt.Println("ok")
  4. }

}

  1. 2. || 也叫短路或: 如果第一个条件为 true ,则第二个条件不会判断,最终结果为 true
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. //声明一个函数(测试)
  6. func test() bool{
  7. fmt.Println("test...")
  8. return true
  9. }
  10. func main() {
  11. var i int = 10
  12. if i > 9 || test() {
  13. fmt.Println("hello...")
  14. }
  15. }

赋值运算符

  1. 赋值运算符就是将某个运算后的值,赋给指定的变量。

    赋值运算符的分类

  2. 赋值运算符的分类 | 运算符 | 描述 | 实例 | | —- | —- | —- | | = | 简单的赋值运算符,将一个表达式的值赋给一个左值 | C = A + B 将 A+B 表达式结果赋值给 C | | += | 相加后再赋值 | C += A 等于 C = C + A | | -= | 相减后再赋值 | C -= A 等于 C = C - A | | = | 相乘后再赋值 | C = A 等于 C = C * A | | /= | 相除后再赋值 | C /= A 等于 C = C / A | | %= | 求余后再赋值 | C %= A 等于 C = C % A | | <<= | 左移后赋值 | C <<= 2 等于 C = C << 2 | | &= | 按位与后赋值 | C &= 2 等于 C = C & 2 | | ^= | 按位异或后赋值 | C ^= 2 等于 C = C ^ 2 | | |= | 按位或后赋值 | C |= 2 等于 C = C | 2 |

  3. 说明:这部分的赋值运算涉及到二进制相关知识,我们放在讲二进制的时间再回头讲解。

  4. 相关案例 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { //赋值运算符的使用演示 var i int i = 10 //基本赋值 fmt.Println(“i =”, i)

  1. //有两个变量,a 和 b,要求将其进行交换,最终打印结果。
  2. // a = 9, b = 2 ==> a = 2, b = 9
  3. a := 9
  4. b := 2
  5. fmt.Printf("交换前的情况下是 a = %v , b = %v \n", a, b)
  6. //定义一个临时变量
  7. t := a
  8. a = b //
  9. b = t
  10. fmt.Printf("交换后的情况下是 a = %v , b = %v \n", a, b)
  11. //复合赋值的操作
  12. a += 17 //等价 a = a + 17
  13. fmt.Println("a =", a)

}

  1. <a name="qXrts"></a>
  2. #### 赋值运算符特点
  3. 1. 运算顺序从右往左
  4. 1. 赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量值。
  5. 1. 复合赋值运算符等价于下面的效果。比如:a += 3 等价于 a = a + 3
  6. 1. 相关案例
  7. ```go
  8. package main
  9. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  10. func test() int {
  11. return 90
  12. }
  13. func main() {
  14. //赋值运算符的使用演示
  15. var i int
  16. i = 10 //基本赋值
  17. fmt.Println("i =", i)
  18. //有两个变量,a 和 b,要求将其进行交换,最终打印结果。
  19. // a = 9, b = 2 ==> a = 2, b = 9
  20. a := 9
  21. b := 2
  22. fmt.Printf("交换前的情况下是 a = %v , b = %v \n", a, b)
  23. //定义一个临时变量
  24. t := a
  25. a = b
  26. b = t
  27. fmt.Printf("交换后的情况下是 a = %v , b = %v \n", a, b)
  28. //复合赋值的操作
  29. a += 17 //等价 a = a + 17
  30. fmt.Println("a =", a)
  31. //赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量值。
  32. //表达式:任何有值都可以看做表达式
  33. var d int
  34. d = a //
  35. d = 8 + 2 * 8 // =的右边是表达式
  36. d = test() + 90 // =的右边是表达式
  37. d = 890 // 890 常量
  38. fmt.Println(d)
  39. }
  1. 相关练习 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { //有两个变量,a 和 b,要求将其进行交换,但是不允许使用中间变量,最终打印结果 var a int = 10 var b int = 20

  1. a = a + b //
  2. b = a - b // b = a + b - b ==> b = a
  3. a = a - b // a = a + b - a ==> a = b
  4. fmt.Printf("a = %v b = %v", a, b)

}

  1. <a name="pS83Y"></a>
  2. ### 运算符的优先级
  3. 1. 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
  4. 1. 只有单目运算符、赋值运算符是从右向左运算的。
  5. 1. 大致顺序整理
  6. - 括号, ++, --
  7. - 单目运算
  8. - 算术运算
  9. - 移位运算
  10. - 关系运算
  11. - 位运算
  12. - 逻辑运算
  13. - 赋值运算符
  14. - 逗号
  15. | 分类 | 描述 | 关联性 |
  16. | --- | --- | --- |
  17. | 后缀 | () [] -> . ++ -- | 左到右 |
  18. | 单目 | + - ! ~ (type) * & sizeof | 右到左 |
  19. | 乘法 | */% | 左到右 |
  20. | 加法 | + - | 左到右 |
  21. | 移位 | << >> | 左到右 |
  22. | 关系 | < <= > >= | 左到右 |
  23. | 相等(关系) | == != | 左到右 |
  24. | 按位AND | & | 左到右 |
  25. | 按位XOR | & | 左到右 |
  26. | 按位OR | &#124; | 左到右 |
  27. | 逻辑AND | && | 左到右 |
  28. | 逻辑OR | &#124;&#124; | 左到右 |
  29. | 赋值运算符 | = += -= *= /= %= >>= <<= &= ^= | 右到左 |
  30. | 逗号 | , | 左到右 |
  31. <a name="fjSZ4"></a>
  32. ### 其他运算符
  33. <a name="ansBE"></a>
  34. #### 其他运算符说明
  35. 1. 其他运算符说明
  36. | 运算符 | 描述 | 实例 |
  37. | --- | --- | --- |
  38. | & | 返回变量存储地址 | &a; 将给出变量的实际地址 |
  39. | * | 指针变量 | *a; 将给出变量的实际地址 |
  40. 2. Go 语言明确不支持三元运算符。
  41. 2. 相关案例
  42. ```go
  43. package main
  44. import "fmt" // fmt 包中提供格式化,输出,输入的函数
  45. func main() {
  46. //演示 & 和 * 的使用
  47. a := 100
  48. fmt.Println("a 的地址 =", &a)
  49. var ptr *int = &a
  50. fmt.Println("*ptr 指向的值 =", *ptr)
  51. var n int
  52. var i int = 10
  53. var j int = 12
  54. //传统的三元运算符
  55. //n = i > j ? i : j
  56. if i > j {
  57. n = i
  58. } else {
  59. n = j
  60. }
  61. fmt.Println("n = ", n)
  62. }

键盘输入语句

基本介绍

  1. 在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。

    步骤

  2. 导入fmt 包

  3. 调用 fmt 包的 fmt.Scanln() 或者 fmt.Scanf()

    相关案例

  4. 方式1:fmt.scanln ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { //要求:可以从控制台接收用户信息,其中包括:姓名,年龄,薪水,是否通过考试。 //方式1 fmt.scanln //1. 先声明需要的变量 var name string var age byte var sal float32 var isPass bool //当程序执行到 fmt.Scaln(&name) ,程序会停止在这里,等待用户输入,并回车 fmt.Println(“请输入姓名 “) fmt.Scanln(&name)

  1. fmt.Println("请输入年龄 ")
  2. fmt.Scanln(&age)
  3. fmt.Println("请输入薪水 ")
  4. fmt.Scanln(&sal)
  5. fmt.Println("请输入是否通过考试")
  6. fmt.Scanln(&isPass)
  7. fmt.Printf("名字是 %v \n 年龄是 %v \n 薪水是 %v \n 是否通过考试 %v \n", name, age, sal, isPass)

}

  1. 2. 方式2fmt.Scanf,可以按指定的格式输入
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. func main() {
  6. //要求:可以从控制台接收用户信息,其中包括:姓名,年龄,薪水,是否通过考试。
  7. //1. 先声明需要的变量
  8. var name string
  9. var age byte
  10. var sal float32
  11. var isPass bool
  12. //方式2:fmt.Scanf,可以按指定的格式输入
  13. fmt.Println("请输入你的姓名,年龄,薪水,是否通过考试, 使用空格隔开")
  14. fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
  15. fmt.Printf("名字是 %v \n 年龄是 %v \n 薪水是 %v \n 是否通过考试 %v \n", name, age, sal, isPass)
  16. }

进制

进制的介绍

  1. 对于整数,有四种表示方式:
    • 二进制:0,1,满 2 进 1。
      • 在 Golang 中,不能直接使用二进制来表示一个整数,它沿用了 C 的特点。
    • 十进制:0-9,满 10 进 1 。
    • 八进制:0-7, 满 8 进 1 。
      • 在 Golang 中,可以直接使用八进制来表示一个整数。
    • 十六进制:0-9 及 A-F,满 16 进 1 。以 0x 或者 0X 开头表示。此处的 A-F 不区分大小写
      • 如: 0x21AF + 1 = 0X21B0
  2. 相关案例 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

//演示进制 func main() {

  1. var i int = 5
  2. //二进制输出
  3. fmt.Printf("%b \n", i)
  4. //八进制:0-7, 满 8 进 1 。
  5. var j int = 011 // 011 => 9
  6. fmt.Println("j =", j)
  7. //十六进制:0-9 及 A-F,满 16 进 1 。以 Ox 或 Ox 开头表示。
  8. var k int = 0x11 // 0x11 => 16 + 1 = 17
  9. fmt.Println("k =", k)

}

  1. 3. 进制图示
  2. | 十进制 | 十六进制 | 八进制 | 二进制 |
  3. | --- | --- | --- | --- |
  4. | 0 | 0 | 0 | 0 |
  5. | 1 | 1 | 1 | 1 |
  6. | 2 | 2 | 2 | 10 |
  7. | 3 | 3 | 3 | 11 |
  8. | 4 | 4 | 4 | 100 |
  9. | 5 | 5 | 5 | 101 |
  10. | 6 | 6 | 6 | 110 |
  11. | 7 | 7 | 7 | 111 |
  12. | 8 | 8 | 10 | 1000 |
  13. | 9 | 9 | 11 | 1001 |
  14. | 10 | A | 12 | 1010 |
  15. | 11 | B | 13 | 1011 |
  16. | 12 | C | 14 | 1100 |
  17. | 13 | D | 15 | 1101 |
  18. | 14 | E | 16 | 1110 |
  19. | 15 | F | 17 | 1111 |
  20. | 16 | 10 | 20 | 10000 |
  21. | 17 | 11 | 21 | 10001 |
  22. <a name="RNrmL"></a>
  23. #### 进制的转换
  24. <a name="hlpba"></a>
  25. ##### 进制转换的介绍
  26. 1. 第一组(其他进制转十进制)
  27. - 二进制转十进制
  28. - 规则:从最低位开始(右边的),将每个位上的数提取出来,乘以 2 的(位数 - 1)次方,然后求和。
  29. - 八进制转十进制
  30. - 规则:从最低位开始(右边的),将每个位上的数提取出来,乘以 8 的(位数 - 1)次方,然后求和。
  31. - 十六进制转十进制
  32. - 规则:从最低位开始,将每个位上的数提取出来,乘以 16 的(位数 - 1)次方,然后求和。
  33. 2. 第二组(十进制转其他进制)
  34. - 十进制转二进制
  35. - 规则:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
  36. - 十进制转八进制
  37. - 规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
  38. - 十进制转十六进制
  39. - 规则:将该数不断除以 16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
  40. 3. 第三组(二进制转其他进制)
  41. - 二进制转八进制
  42. - 规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
  43. - 二进制转十六进制
  44. - 规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。
  45. 4. 第四组(其他进制转二进制)
  46. - 八进制转二进制
  47. - 规则:将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
  48. - 十六进制转二进制
  49. - 规则:将十六进制每 1 位,转成对应的一个 4 位的二进制数即可。
  50. <a name="kyqS8"></a>
  51. #### 二进制在运算中的说明
  52. 1. 二进制是逢 2 进位的进位制,01 是基本算符。
  53. 1. 现代的电子计算机技术全部采用的是二进制,因为它只使用 01 两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。
  54. 1. 二进制(Binary)数用 0 1 两个数字及其组合来表示任何数,进位规则是逢 2 1,数字 1 在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
  55. <a name="HNf3f"></a>
  56. #### 原码、反码、补码
  57. 1. 网上对原码,反码,补码的解释过于复杂,这里精简几句话:
  58. - 二进制的最高位是符号位:0 表示正数,1 表示负数
  59. - 正数的原码,反码,补码都一样。
  60. - 负数的反码 = 它的原码符号位不变,其他位取反(0 -> 1, 1 -> 0)
  61. - 负数的补码 = 它的反码 + 1
  62. - 0 的反码,补码都是 0
  63. - 在计算机运算时候,都是以补码的方式运算的。
  64. <a name="bELLq"></a>
  65. ### 位运算符
  66. <a name="MCNsd"></a>
  67. #### 位运算符一览
  68. | 运算符 | 描述 |
  69. | --- | --- |
  70. | & | 按位与运算符 & 是双目运算符。其功能是参与运算的两数各对应的二进位相与。运算规则是:同时为 1,结果为 1,否则为 0 |
  71. | &#124; | 按位或运算符 &#124; 是双目运算符。其功能是参与运算的两数各对应的二进制相或。运算规则是:有一个为 1,结果为 1,否则为 0 |
  72. | ^ | 按位异或运算符 ^ 是双目运算符。其功能是参与运算的两数各对应的二进位相异或。运算规则是:当二进位不同时,结果为 1,否则为 0 |
  73. | << | 左移运算符 << 是双目运算符。其功能把 << 左边的运算数的各二进位全部左移若干位,高位丢弃,低位补 0。左移 n 位就是乘以 2 n 次方。 |
  74. | >> | 右移运算符 >> 是双目运算符。其功能是把 >> 左边的运算数的各个二进位全部右移若干位右移 n 位就是除以 2 n 次方。 |
  75. <a name="cCmOt"></a>
  76. #### 位运算符合和移位运算符
  77. 1. Golang 中有 3 个位运算
  78. - 按位与&: 两位全为 1 ,结果为 1 ,否则为 0
  79. - 按位或|: 两位有一个为 1 ,结果为 1 ,否则为 0
  80. - 按位异或^: 两位一个为 0,一个为 1,结果为 1,否则为 0
  81. 2. 相关案例
  82. ```go
  83. package main
  84. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  85. //演示位运算
  86. func main() {
  87. //位运算的演示
  88. fmt.Println(2&3) // 2
  89. fmt.Println(2|3) // 3
  90. fmt.Println(2^3) // 1
  91. //-2 原码:[1000 0010] 反码:[1111 1101] 补码:[1111 1110]
  92. //2 原码:[0000 0010] 反码:[0000 0010] 补码:[0000 0010]
  93. //-2^2: [1111 1100](补码) ==> 反码:[1111 1011] 原码:[1000 0100]
  94. fmt.Println(-2^2) // -4
  95. }
  1. Golang 中有 2 个移位运算符
    • >><< 右移和左移,运算规则:
      • 右移运算符 >>: 低位溢出,符号位不变,并用符号位补溢的高位。
      • 左移运算符 <<: 符号位不变,低位补 0
  2. 相关案例 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

//演示位运算 func main() {

  1. //位运算的演示
  2. fmt.Println(2&3) // 2
  3. fmt.Println(2|3) // 3
  4. fmt.Println(2^3) // 1
  5. //-2 原码:[1000 0010] 反码:[1111 1101] 补码:[1111 1110]
  6. //2 原码:[0000 0010] 反码:[0000 0010] 补码:[0000 0010]
  7. //-2^2: [1111 1100](补码) ==> 反码:[1111 1011] 原码:[1000 0100]
  8. fmt.Println(-2^2) // -4
  9. a := 3 >> 2 // [0000 0011] ==> [0000 0000] ==> 0
  10. fmt.Println(a)
  11. b := 3 << 2 // [0000 0011] ==> [0000 1100] ==> 12
  12. fmt.Println(b)

} ```


课程来源