Golang中的奇技淫巧

Go

本文最后更新于 <span id="expire-date"></span> 天前,文中部分描述可能已经过时。

位运算

1
2
3
4
5
6
&	bitwise And
| bitwise OR
^ bitwise XOR
&^ AND NOT
<< left shift
>> right shift

& 运算

在GO中, & 运算符在两个整型操作数中执行按位 AND 操作,

1
2
3
Given operands a, b
AND(a, b) = 1; only if a == b && b == 1
else AND(a, b) = 0

AND运算符具有选择性地把整形数据地位清除为0地好的效果。例如,我们可以使用&运算符去清除(设置)最后4个最低有效位(LSB)全部为0

1
2
3
4
5
6
7
8
9
func main(){
var x uint8 = 0xAA // x = 10101010
var y uint8 = 0xA3 // y = 10100011
var z uint8 = x & y // z = 10100010
/*
x &= y 可代替z

*/
}

奇数的二进制数末尾为1,可以与1进行&操作判断是否是奇数

1
2
3
4
5
6
7
8
func main(){
int x = rand.Int()
if x & 1 == 1{
fmt.Println("odd")
}else{
fmt.Println("even")
}
}9

| 操作符

|对其整型操作数执行按位操作

1
2
OR(a, b) = 1; when a = 1 || b = 1
else OR(a, b) = 0

^ 操作符

在 Go 中 按位 异或 操作是用 ^ 来表示的。 异或运算符有如下的特点:

1
2
3
Given operands a, b
XOR(a, b) = 1; only if a != b
else = 0

与 1 进行异或的位被翻转

可以利用 异或运算去比较两个数字的符号是否一样。当 (a ^ b) ≥ 0 (或相反符号的 (a ^ b) < 0 )为 true 的时候,两个整数 a,b 具有相同的符号

1
2
3
4
func main() {
a, b := -12, 25
fmt.Println("a and b have same sign?", (a ^ b) >= 0)
}

^ 作为取反位运算符(非)

XOR 运算符 ^,作为一元取反运算符作用于一个数字

1
2
3
4
5
6
7
8
9
package main
import "fmt"

func main() {
var a uint8 = 0x0F
// 00001111
fmt.Printf("%08b\n%08b" ,a , ^a)
// 11110000
}

&^ 操作符

&^ 操作符意为 与非,是 操作符的简写形式

1
2
Given operands a, b
AND_NOT(a, b) = AND(a, NOT(b))

<< 和 >> 操作符

Go 使用 <<>> 来表示左移运算符和右移运算符

1
2
3
Given integer operands a and n,
a << n; shifts all bits in a to the left n times
a >> n; shifts all bits in a to the right n times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import "fmt"

func main() {
a := 3
fmt.Printf("%08b\n", a)
//00000011
fmt.Printf("%08b\n", a<<1)
//00000110
fmt.Printf("%08b\n", a<<2)
//00001100
fmt.Printf("%08b\n", a<<3)
//00011000
fmt.Printf("%08b\n", a<<4)
//00110000
}


左移一位相当于除以2,右移一位相当于乘以2

1
2
3
4
5
6
7
8
9
package main
import "fmt"

func main() {
a := 28
fmt.Println(a)
fmt.Println(a >> 1)
fmt.Println(a << 1)
}

本文作者:Mosquito

本文链接: http://example.com/2022/04/25/Golang%E4%B8%AD%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/

Mosquito 天使之吻手打

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。