Golang位操作

1,474 阅读1分钟

在高并发编程中,在不增加成本的情况下,需要尽可能的增加代码的执行速度。在程序中使用位操作毫无疑问能够带来事半功倍的效果。

位操作到底需要实现哪些操作呢?

我觉得以下的三种操作是非常必要。

  • 获取某一位的值,位移操作
  • 修改某一位的值,包括设置为0或者设置为1两种方式
  • 取反某一位的值,异或操作
func BitDemo() {
	// byte是uint8的匿称,在操作系统是用一个字节来保存,用于表示[0-255]的整数
	var a uint8 = 20                   //
	fmt.Println(biu.ToBinaryString(a)) // 00010100

	// 将a的第2位设置为1,使用或操作
	fmt.Println(biu.ToBinaryString(a | 1<<1)) // 00010110

	// 将a的第3位设置为0,使用与操作,保证用于执行与操作的出了第3位为0,其他位皆为1。简单来说就是要得到11111011
	// 将1向左移动2位,然后取反即可。
	fmt.Println(biu.ToBinaryString(a &^ (1 << 2))) // 00010000

	// 移位操作取某一位值,先将目标位左移到最开头,然后右移到最后一位,如取第3位的值,
	fmt.Println(biu.ToBinaryString((a << 5) >> 7)) // 00000001

	// 取反某一位,即异或操作。在Go中使用 ^ 来表示取异或,位值相同为0,位值不同为1
	// 第3位取反,可以使用 1 << 2 = 00000100,00000100 ^ 00010100 = 00010000
	fmt.Println(biu.ToBinaryString((1 << 2) ^ a)) // 00010000
}