- 算术运算符 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