- 算术运算符 Arithmetic Operators
+-*/%++--- 比较运算符 Comparison Operators
><==!=>=<=- 逻辑运算符 Logical Operators
&&||!- 按位运算符 Bitwise Operators
&按位与 bitwise AND|按位或 bitwise OR^按位取反 bitwise NOT / 按位异或 bitwise XOR- 注意:其他很多语言都是采用
~表示取反 &^bit clear (AND NOT)<<左移,>>右移- 赋值运算符 Assignment Operators
=以及算术运算赋值,位运算赋值- 其他运算符 Misc Operators
*指针,&取地址,<-通道接收
Operator precedence
| 优先级 | 运算符 |
| ------ | ------------------------------ | ----- | --- |
| 5 | * / % << >> & &^ |
| 4 | + - | ^ |
| 3 | 关系运算符 |
| 2 | && |
| 1 | | | |
示例
package main
import "fmt"
func main() {
var a uint8 = 0b_0011_1100 // 60
var b uint8 = 0b_0000_1111 // 15
fmt.Printf(" a %08b (%d)\n", a, a)
fmt.Printf(" b %08b (%d)\n", b, b)
fmt.Println()
fmt.Printf(" NOT %08b 非(NOT a)\n", (^a))
fmt.Println()
fmt.Printf(" AND %08b 与\n", (a & b))
fmt.Printf(" OR %08b 或\n", (a | b))
fmt.Printf(" XOR %08b 异或\n", (a ^ b))
fmt.Println()
fmt.Printf(" NAND %08b 与非\n", ^(a & b))
fmt.Printf(" NOR %08b 或非\n", ^(a | b))
fmt.Printf(" XNOR %08b 同或(异或非)\n", ^(a ^ b))
fmt.Println()
fmt.Printf("AND NOT %08b BitClear\n", (a &^ b))
// fmt.Printf("AND NOT %08b BitClear\n", (a & (^b)))
// 格式化工具会将 ^ 和右操作数放在一起
// 这一点和 &^ 不同,应该是由于 Golang Spec 中,将 &^ 当成一个操作符
// 本质上,没有什么区别,都是先按位取反,再按位与或
fmt.Printf(" OR NOT %08b Useless\n", (a | ^b))
// fmt.Printf(" OR NOT %08b Useless\n", (a | (^b)))
}
// a 00111100 (60)
// b 00001111 (15)
// NOT 11000011 非(NOT a)
// AND 00001100 与
// OR 00111111 或
// XOR 00110011 异或
// NAND 11110011 与非
// NOR 11000000 或非
// XNOR 11001100 同或(异或非)
// AND NOT 00110000 BitClear
// OR NOT 11111100 Useless
参考资料与拓展阅读
- https://go.dev/ref/spec#Operators
- 掘金,Golang 位运算实战用法
- cppreference.com, C Operator Precedence