package main
import "fmt"
func main() {
x := 3
y := 5
z := false
// 3 -> 011
// 5 -> 101
fmt.Println("X AND Y = ", x & y)
fmt.Println("X OR Y = ", x | y)
fmt.Println("X EXOR Y = ", x ^ y)
fmt.Println("X Right Shift 1 = ", x >> 1)
fmt.Println("X Right Shift 2 = ", x >> 2)
fmt.Println("Y Left Shift 1 = ", y << 1)
}
$ go run bitwise/main.go
X AND Y = 1
X OR Y = 7
X EXOR Y = 6
X Right Shift 1 = 1
X Right Shift 2 = 0
Y Left Shift 1 = 10
很多编程语言使用 ~
作为一元按位取反(NOT)操作符, Go 重用 ^
XOR 操作符来按位取反:
// 错误的取反操作
func main() {
fmt.Println(~2) // bitwise complement operator is ^
}
// 正确示例
func main() {
var d uint8 = 2
fmt.Printf("%08b\n", d) // 00000010
fmt.Printf("%08b\n", ^d) // 11111101
}
同时 ^ 也是按位异或(XOR)操作符:
10000010 ^ 00000010 = 10000000
package main
import "fmt"
func main() {
a := 45
b := "Something"
fmt.Println(a > 40 && b == "Something")
fmt.Println(a < 40 && b == "Something")
fmt.Println(a < 40 || b == "Something")
fmt.Println(a < 40 || b != "Something")
fmt.Println(!(a < 40 || b != "Something"))
}
$ go run logical/main.go
true
false
true
false
true
package main
import "fmt"
func main() {
a := 30
b := 50
fmt.Println("A + B = ", a+b)
fmt.Println("A - B = ", a-b)
fmt.Println("A * B = ", a*b)
fmt.Println("A / B = ", a/b)
fmt.Println("A % B = ", a%b)
}
$ go run arithmetic/main.go
A + B = 80
A - B = -20
A * B = 1500
A / B = 0
A % B = 30
package main
import "fmt"
func main() {
k := 3
j := 20
fmt.Println("k = ", k)
fmt.Println("j = ", j)
k++
j--
fmt.Println("k = ", k)
fmt.Println("j = ", j)
}
$ go run arithmetic/main.go
k = 3
j = 20
k = 4
j = 19
package main
import "fmt"
func main() {
var a int = 100
b := 20
fmt.Println("a = ", a)
fmt.Println("b = ", b)
a += 30
fmt.Println("a = ", a)
b -= 5
fmt.Println("b = ", b)
a *= b
fmt.Println("a = ", a)
fmt.Println("b = ", b)
a /= b
fmt.Println("a = ", a)
fmt.Println("b = ", b)
a %= b
fmt.Println("a = ", a)
fmt.Println("b = ", b)
}
$ go run assignment/main.go
a = 100
b = 20
a = 130
b = 15
a = 1950
b = 15
a = 130
b = 15
a = 10
b = 15
package main
import "fmt"
func main() {
a := 45
b := 12
fmt.Println("Is A equal to B ? ", a == b)
fmt.Println("Is A not equal to B ? ", a != b)
fmt.Println("Is A greater than B ? ", a > b)
fmt.Println("Is A less than B ? ", a < b)
fmt.Println("Is A greater than or equal to B ? ", a >= b)
fmt.Println("Is A less than or equal to B ? ", a <= b)
}
$ go run comparison/main.go
Is A equal to B ? false
Is A not equal to B ? true
Is A greater than B ? true
Is A less than B ? false
Is A greater than or equal to B ? true
Is A less than or equal to B ? false