运算符
运算符用于在程序运行时执行数学或逻辑运算。
Go语言中内置的运算符有:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
算术运算符
运算符 |
描述 |
+ |
相加 |
- |
相减 |
* |
相乘 |
/ |
相除 |
% |
求余 |
++ (单独的语句) |
自增 |
_ _ (单独的语句) |
自减 |
注意: ++ (自增)和-- (自减)在Go语言中是单独的语句,并不是运算符。
代码:
package main
import "fmt"
var n1 = 19
var n2 = 3
func main() {
fmt.Println(n1 + n2) // + 结果: 21
fmt.Println(n1 - n2) // - 结果: 16
fmt.Println(n1 * n2) // * 结果: 57
fmt.Println(n1 / n2) // / 结果: 6
// 取余
fmt.Println(n1 % n2) // % 结果: 1
// ++
n1++
fmt.Println(n1) // 自增一次 结果: 20
// --
n2--
fmt.Println(n2) //自减一次 结果: 2
}
关系运算符
运算符 |
描述 |
== |
检查两个值是否相等,如果相等返回 True 否则返回 False。 |
!= |
检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
> |
检查左边值是否大于右边值,如果是返回 True 否则返回 False。 |
>= |
检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
< |
检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
<= |
检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
代码:
package main
import "fmt"
func RelationalOperator() {
var n1 = 19
var n2 = 3
fmt.Println(n1 == n2) // 结果:false
fmt.Println(n1 != n2) // 结果: true
fmt.Println(n1 > n2) // 结果: true
fmt.Println(n1 < n2) // 结果: false
fmt.Println(n1 >= n2) // 结果: true
fmt.Println(n1 <= n2) // 结果: fales
}
func main() {
RelationalOperator()
}
逻辑运算符
运算符 |
描述 |
&& |
逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。 |
|| |
逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。 |
! |
逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。 |
代码:
package main
import "fmt"
func LogicalOperators() {
var a = true
var b = false
// and 两边都为真 则为真 否则就为 假
fmt.Println(a && b) // 结果: false
// or 只要有一边为真 就为真 否则为 假
fmt.Println(a || b) // 结果:true
// not 取非如果为真就为假 取非为假就为真
fmt.Println(!a) // a是 true 结果: false
fmt.Println(!b) // bs是 false 结果: true
}
func main() {
LogicalOperators()
}
位运算符
位运算符对整数在内存中的二进制进行操作.
运算符 |
描述 |
& |
参与运算的两数各对应的二进位相与。 (两位均为1才为1) |
| |
参与运算的两数各对应的二进位相或。 (两位有一个为1就为1) |
^ |
参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1) |
<< |
左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
>> |
右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。 |
代码:
package main
import "fmt"
func main() {
fmt.Printf("13的二进制 ————> %b \n",13) // 结果:1101
fmt.Printf("13的二进制 ————> %b \n",3) // 结果:11
// & (两位均为1才为1) 0001
fmt.Println(13 & 3) // 结果 1
// | (两位只要有1则为1) 1111
fmt.Println(13 | 3) // 结果 15
// ^ (两位不一样 则为1) 1110
fmt.Println(13 ^ 3) // 结果 14
// 右移n位就是除以2的n次方。
// “a>>b”是把a的各二进位全部右移b位。
fmt.Println(3 >> 10) // 3的二进制 11 变成 : 110000000000 结果: 3072 也就是 2的11次方 2的10次方
// 左移n位就是乘以2的n次方。
// “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。
fmt.Println(3 << 1) //结果 1 高位就丢弃了
}
这是怎么算出来的呢? 上图:
赋值运算符
运算符 |
描述 |
= |
简单的赋值运算符,将一个表达式的值赋给一个左值 |
+= |
相加后再赋值 |
-= |
相减后再赋值 |
*= |
相乘后再赋值 |
/= |
相除后再赋值 |
%= |
求余后再赋值 |
<<= |
左移后赋值 |
>>= |
右移后赋值 |
&= |
按位与后赋值 |
|= |
按位或后赋值 |
^= |
按位异或后赋值 |
这个就不多说了.
练习题
有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?
代码:
package main
import "fmt"
func main() {
// 发现了一个规律 任何数和 0做异运算都等于那个数的本事
// 任何数和 自身做运算都等于0
// 异运算 满足交换率和结合率 出现了一个规律 如果说你的数组重复多个值 只有一个值不重复 隔着一个出现那个 不重复的值
// 即等于 : a ^ b ^ a=b ^ a ^ a=b ^ (a ^ a) = b ^ 0=ba⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
var a = []int{1,1,2,2,3,4,4,5,5}
var res = 0
for i:=0;i<len(a);i++{
res = res ^ a[i]
// 0 1 = 1
// 1 1 = 0
// 0 2 = 2
// 2 2 = 0
// 0 3 = 3
// 3 4 = 7
// 7 4 = 3
// 3 5 = 6
// 6 5 = 3
}
fmt.Println(res)
}
|
请发表评论