目录
一、概述
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等
- 算数运算符
- 赋值运算符
- 比较运算符/关系运算符
- 逻辑运算符
- 位运算符
- 其他运算符
1、算数运算符
算数运算符是对数值类型的变量进行运算的,比如:加减乘除。在Go程序中使用的非常多。
- +:正号
- -:负号
- +:加
- -:减
- *:乘
- /:除
- %:取模(取余)
- ++:自增
- --:自减
- +:字符串相加
注:
- 对于除号"/",它的整数除和小数除是有区别的,整数之间做除法时,只保留整数部分而舍弃小数部分。例:x :=19/5,结果是 3
- 当对一个数取模时,可以等价 a%b=a-a/b*b
- Golang的自增和自减只能当作一个独立语言使用,不能这样使用 b:=a++ 或者 b:=a--
- Golang的++和--只能写在变量后面,不能写在变量的前面,即:只有a++ a--没有++a --a
- Golang的设计者去掉c/java中的自增自减的容易混淆的写法,让Golang更加简洁,统一。
2、关系运算符
-
关系运算符的结果都是bool型,也就是要么是true,要么是false
-
关系表达式经常用在if结构的条件中或循环结构的条件中
-
'==':相等于
-
'!=':不等于
-
'<':小于
-
'>':大于
-
'<=':小于等于
-
'>=':大于等于
package main
import (
"fmt"
)
func main() {
x :=19/5
fmt.Println(x)
var a = 5
var b = 9
fmt.Println("a%b=",a%b)
fmt.Println("a-a/b*b=",a-a/b*b)
var n1 int = 5
var n2 int = 9
fmt.Println(n1==n2)
fmt.Println(n1!=n2)
fmt.Println(n1<n2)
fmt.Println(n1>n2)
fmt.Println(n1<=n2)
fmt.Println(n1>=n2)
}
3、逻辑运算符
用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值。
- &&:逻辑与运算符。如果两边的操作数都是True,则为True,否则,为False。
- ||:逻辑与运算符。如果两边的操作数有一个True,则为True,否则,为False。
- !:逻辑非运算符。如果条件为True,则逻辑为False,否则为True。
- &&也叫短路与,如果第一个条件为False,则第二个条件不会判断,最终结果为false
- ||也叫短路或,如果第一个条件为true,则第二个条件不会判断,最终结果为true
4、赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量。
- =:将一个表达式的值赋给左值,C=A+B
- +=:相加后再赋值,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
- |=:按位或后再赋值,C|=2等于C=C|2
- 运算顺序从右往左
- 赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量值
面试题:
有两个变量,a和b,要求将其进行交换,但是不允许使用中间变量,最终打印结果。
package main
import (
"fmt"
)
func main() {
var a = 3
var b = 5
a=a+b
b=a-b
a=a-b
fmt.Println(a,b)
}
5、运算符优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下,上面优先于下面
只有单目运算符、赋值运算符是从右向左运算的。
分类 | 描述 | 关联性 |
后缀 | ()[]->.++ -- | 左到右 |
单目 | + - ! ~ (type)* & sizeof | 右到左 |
乘法 | * / % | 左到右 |
加法 | + - | 左到右 |
移位 | << >> | 左到右 |
关系 | < <= > >= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
赋值运算符 | =: += -= *= /= %= <<= >>= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
6、位运算符
- &:按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。运算规则是:同时为1,结果为1,否则为0.
- |:按位或运算符"|"是双目运算符。其功能是参与运算的两数各对应的二进位相或。运算规则是:有一个为1,结果为1,否则为0.
- ^:按位异或运算符"^"是双目运算符。其功能是参与运算的两数各对应的二进位相异或。运算规则是:当二进位不同时,结果为1,否则为0.
- <<:左移运算符"<<"是双目运算符。其功能把"<<"左边的运算数的各二进制位全部左移若干位,高位丢失,低位补0.左移n位就是乘以2的n次方。
- ">>":右移运算符">>"是双目运算符。其功能把">>"左边的运算数的各二进制位全部右移若干位.右移n位就是除以2的n次方。
package main
import (
"fmt"
)
func main() {
var a int = 1 >> 2
var b int = -1 >> 2
var c int = 1 << 2
var d int = -1 << 2
fmt.Println("a=",a)
fmt.Println("b=",b)
fmt.Println("c=",c)
fmt.Println("d=",d)
fmt.Println(2&3)
fmt.Println(2|3)
fmt.Println(13&7)
fmt.Println(5|4)
fmt.Println(-3^3)
}
7、其他运算符
- &:返回变量存储地址,&a 将给出变量a的实际地址
- *:指针变量, *a 是一个指针变量
Go语言明确不支持三元运算符
Golang的设计理念:一种事情有且只有一种方法完成
二、进制
对于整数,有四种表示方式:
- 二进制:0,1,满2进1.
- 十进制:0-9,满10进1.
- 八进制:0-7,满8进1,以数字0开头表示。
- 十六进制:0-9及A-F,满16进1,以0x或0X开头表示。此处A-F不区分大小写。如:0x21AF+1=0x21B0
package main
import (
"fmt"
)
func main() {
var i int = 5
fmt.Printf("二进制输出i=%b\n",i)
var j int = 011
fmt.Println("八进制j=",j)
var k int = 0x11
fmt.Println("16进制k=",k)
}
1、进制转换
1、其他进制转十进制
1.1、二进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
1.2、八进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
1.3、十六进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
2、十进制转其他进制
2.1、十进制转二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
2.2、十进制转八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
2.3、十进制转十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
3、二进制转其他进制
3.1、二进制转八进制
规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
将二进制:11010101转成八进制。11010101=0325
3.2、二进制转十六进制
规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。
将二进制:11010101转成十六进制。11010101=D5
4、其他进制转二进制
4.1、八进制转二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
将0237转成二进制. 0237=10011111
4.2、十六进制转二进制
规则:将十六进制数每1位,转成对应的一个4位的二进制数即可。
将0x237转成二进制. 0x237=1000110111
5、二进制在运算中的说明
二进制是逢2进位的进位制,0、1是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
三、原码、补码、反码
对于有符号的而言:
- 二进制的最高位是符号位:0表示正数,1表示负数。
- 正数的原码,反码,补码都一样。
- 负数的反码=它的原码符号位不变,其他位取反(0-->1,1-->0)。
- 负数的补码=它的反码+1。
- 0的反码,补码都是0。
- 在计算机运算的时候,都是以补码的方式来运算的。
1===>原码:[0000 0001]反码:[0000 0001]补码:[0000 0001]
-1==>原码:[1000 0001]反码:[1111 1110]补码:[1111 1111]
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一个为1,结果为1,否则为0
按位异或:两位一个为0,一个为1,结果为1,否则为0
计算:
2&3=2
2的补码:[0000 0010]
3的补码:[0000 0011]
2&3的补码:[0000 0010]=2
2|3=3
2的补码:[0000 0010]
3的补码:[0000 0011]
2|3的补码:[0000 0011]=3
2^3=1
2的补码:[0000 0010]
3的补码:[0000 0011]
2^3的补码:[0000 0001]=1
-2^2=-4
-2的原码:[1000 0010]反码:[1111 1101]补码:[1111 1110]
[1111 1110]
2的补码:[0000 0010]
-2^2的补码:[1111 1100]反码:[1111 1011]原码:[1000 0100]=-4
>>、<<右移和左移运算规则:
右移运算符>>:低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符<<:符号位不变,低位补0
1>>2=0
1的补码:[0000 0001] 右移[0000 0000]=0
1<<2=4
1的补码:[0000 0001] 左移[0000 0100]=4
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!