Go 的位运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 这四个就不介绍了
&
|
>>
<<


//^ 异或 位不一样则为1
a := 5 // 二进制表示为 101
b := 3 // 二进制表示为 011
result := a ^ b // 结果为 6(二进制为 110)

// &^ 将第二个操作数中的位清零,然后将第一个操作数中对应位的值复制到结果中。
a := 5 // 二进制表示为 101
b := 3 // 二进制表示为 011
result := a &^ b // 结果为 4(二进制为 100)

Go语言的标准库中提供了一些与位运算相关的函数。以下是一些常用的函数:

bits.OnesCount:返回一个无符号整数的二进制表示中有多少个1。

1
2
3
4
import "math/bits"

num := uint(5) // 二进制表示为 101
count := bits.OnesCount(num) // 结果为 2

如果我们自己实现这个 OnesCount 可以怎么做呢?
答案:
不停地 & 1 然后循环右移,如果 &1 后是1,说明末尾是1,则计数器++

bits.RotateLeft:将一个无符号整数的二进制表示向左循环移动指定的位数。

1
2
3
4
5
import "math/bits"

num := uint(5) // 二进制表示为 101
shift := 2
rotated := bits.RotateLeft(num, shift) // 结果为 20(二进制为 10100)

bits.RotateRight:将一个无符号整数的二进制表示向右循环移动指定的位数。

1
2
3
4
5
import "math/bits"

num := uint(5) // 二进制表示为 101
shift := 2
rotated := bits.RotateRight(num, shift) // 结果为 1(二进制为 1)

bits.Reverse:反转一个无符号整数的二进制表示。

1
2
3
4
import "math/bits"

num := uint(5) // 二进制表示为 101
reversed := bits.Reverse(num) // 结果为 2684354560(二进制为 10100000000000000000000000000000)

这些函数可以在 math/bits 包中找到,并且提供了高效的位运算实现。在处理位级操作时,这些函数可以提供便利并且保证了跨平台的一致性。