算法术运算符
运算符 | 描述 |
---|---|
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 相除 |
% | 求余,仅限整数 |
//arithmetic 算术运算
func arithmetic() {
var a float32 = 8
var b float32 = 3
var c float32 = a + b
var d float32 = a - b
var e float32 = a * b
var f float32 = a / b
fmt.Printf("a=%.3f, b=%.3f, c=%.3f, d=%.3f, e=%.3f, f=%.3f\n", a, b, c, d, e, f)
}
关系运算符
运算符 | 描述 |
---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False |
//relational 关系运算符
func relational() {
var a float32 = 8
var b float32 = 3
var c float32 = 8
fmt.Printf("a==b吗 %t\n", a == b)
fmt.Printf("a!=b吗 %t\n", a != b)
fmt.Printf("a>b吗 %t\n", a > b)
fmt.Printf("a>=b吗 %t\n", a >= b)
fmt.Printf("a<c吗 %t\n", a < b)
fmt.Printf("a<=c吗 %t\n", a <= c)
}
逻辑运算符
运算符 | 描述 |
---|---|
&& | 逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False |
|| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False |
! | 逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True |
//logistic 逻辑运算符
func logistic() {
var a float32 = 8
var b float32 = 3
var c float32 = 8
fmt.Printf("a>b && b>c吗 %t\n", a > b && b > c)
fmt.Printf("a>b || b>c吗 %t\n", a > b || b > c)
fmt.Printf("a>b不成立,对吗 %t\n", !(a > b))
fmt.Printf("b>c不成立,对吗 %t\n", !(b > c))
}
位运算符
运算符 | 描述 |
---|---|
& | 参与运算的两数各对应的二进位相与(两位均为1才为1) |
| | 参与运算的两数各对应的二进位相或(两位有一个为1就为1) |
^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相同时为0,不同时为1。作为一元运算符时表示按位取反,,符号位也跟着变 |
<< | 左移n位就是乘以2的n次方。a<<b是把a的各二进位全部左移b位,高位丢弃,低位补0。通过左移,符号位可能会变 |
>> | 右移n位就是除以2的n次方。a>>b是把a的各二进位全部右移b位,正数高位补0,负数高位补1 |
//bit_op 位运算
func bit_op() {
fmt.Printf("os arch %s, int size %d\n", runtime.GOARCH, strconv.IntSize) //int是4字节还是8字节,取决于操作系统是32位还是64位
var a int32 = 260
fmt.Printf("260 %s\n", util.BinaryFormat(a))
fmt.Printf("-260 %s\n", util.BinaryFormat(-a)) //负数用补码表示。在对应正数二进制表示的基础上,按拉取反,再末位加1
fmt.Printf("260&4 %s\n", util.BinaryFormat(a&4))
fmt.Printf("260|3 %s\n", util.BinaryFormat(a|3))
fmt.Printf("260^7 %s\n", util.BinaryFormat(a^7)) //^作为二元运算符时表示异或
fmt.Printf("^-260 %s\n", util.BinaryFormat(^-a)) //^作为一元运算符时表示按位取反,符号位也跟着变
fmt.Printf("-260>>10 %s\n", util.BinaryFormat(-a>>10)) //正数高位补0,负数高位补1
fmt.Printf("-260<<3 %s\n", util.BinaryFormat(-a<<3)) //负数左移,可能变成正数
//go语言没有循环(无符号)左/右移符号 >>> <<<
}
//位运算转换k m g
func main() {
k := 1 << 10
m := k << 10
g := m << 10
fmt.Printf("%d %d %d", k, m, g)
}
//1024 1048576 1073741824
位运算的应用场景:
- 逻辑控制(运算快,省CPU)
- bitmap和bloom filter(省内存)
总之,位运算适用于对性能要求高的场景。
func bit_application() {
{
var gender string = "男"
var degree string = "本科"
var is985 bool = true
var condition1 bool = gender == "男"
var condition2 bool = gender == "男" && is985
var condition3 bool = gender == "男" && degree == "硕士" && is985
fmt.Printf("满足条件1 %t\n", condition1)
fmt.Printf("满足条件2 %t\n", condition2)
fmt.Printf("满足条件3 %t\n", condition3)
}
{
var gender byte = 1 //末位,1:男,0:女
var degree byte = 1 << 1 //倒数第二位,1:硕士,0:本科
var is985 byte = 1 << 2 //倒数第三位,1:是985,2:不是985
var man byte = gender | is985
var condition1 byte = gender
var condition2 byte = gender | is985
var condition3 byte = gender | is985 | degree
fmt.Printf("满足条件1 %t\n", man&condition1 == condition1)
fmt.Printf("满足条件2 %t\n", man&condition2 == condition2)
fmt.Printf("满足条件3 %t\n", man&condition3 == condition3)
}
}
赋值运算符
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 |
+= | 相加后再赋值 |
-= | 相减后再赋值 |
*= | 相乘后再赋值 |
/= | 相除后再赋值 |
%= | 求余后再赋值 |
<<= | 左移后赋值 |
>>= | 右移后赋值 |
&= | 按位与后赋值 |
|= | 按位或后赋值 |
^= | 按位异或后赋值 |
//assignment 赋值运算
func assignment() {
var a, b int = 8, 3
a += b
fmt.Printf("a+=b %d\n", a)
a, b = 8, 3
a -= b
fmt.Printf("a-=b %d\n", a)
a, b = 8, 3
a *= b
fmt.Printf("a*=b %d\n", a)
a, b = 8, 3
a /= b
fmt.Printf("a/=b %d\n", a)
a, b = 8, 3
a %= b
fmt.Printf("a%%=b %d\n", a) //%在fmt里有特殊含意,所以需要前面再加个%转义一下
a, b = 8, 3
a <<= b
fmt.Printf("a<<=b %d\n", a)
a, b = 8, 3
a >>= b
fmt.Printf("a>>=b %d\n", a)
a, b = 8, 3
a &= b
fmt.Printf("a&=b %d\n", a)
a, b = 8, 3
a |= b
fmt.Printf("a|=b %d\n", a)
a, b = 8, 3
a ^= b
fmt.Printf("a^=b %d\n", a)
}
位运算
^
- 可以是单目运算符按位取反
- 可以是双目运算符 异或
func main() {
a := 5
fmt.Printf("%b %b", ^a, a^4)
}
//-110 1
&
- 可以是双目运算符与
- 可以是取地址的运算符
func main() {
a := 5
var b *int
b = &a
fmt.Printf("%p %b", b, a&4)
}
//0xc000016088 100
*
- 可以是乘
- 可以标记指针指向的类型
- 可以解析地址,取出地址中的值
func main() {
a := 5
//声明指针变量指向int值
var b *int
b = &a
fmt.Printf("%p %b %d", b, a&4, *b)
}
//0xc000016088 100 5
左移右移
左移补零
右移补一
标签:语言,fmt,运算符,var,Printf,GO,True,float32 From: https://www.cnblogs.com/guangdelw/p/17784797.html