Golang 中的按位置零

按位置零

简单的说它代表的是按位置零。

fmt.Println(0&^0)
fmt.Println(0&^1)
fmt.Println(1&^0)
fmt.Println(1&^1)

// 打印结果如下:
0
0
1
0
  • 如果右侧是 0,则左侧数保持不变
  • 如果右侧是 1,则左侧数一定清零
  • 功能同 a&(^b) 相同

简单结论

z = x &^ y
  1. 如果 y 非零,则 z 为 0
  2. 如果 y 为零,则 z 为 x

实际场景

  1. 使用 iota 先设置a3 个权限常量当作权限值。
  2. a 记录当前用户的权限集合
  3. 将 a 和 权限常量 进行 按位与 运算(两位同时为 1,结果才为 1,否则为 0)。
  4. 通过这个小技巧,我们可以判断出用户是否拥有某项权限。
const (
  Readable   = 1 << iota // int 1, bit 0001
  Writable               // int 2, bit 0010
  Executable             // int 4, bit 0100
)

func TestConstant(t *testing.T) {
  a := 1 // 0001
  t.Log(a&Readable == Readable)
  t.Log(a&Writable == Writable)
  t.Log(a&Executable == Executable)
}
  1. 重新将权限集合设置为 0111,也就是拥有上面列出的所有权限。
  2. 使用 a = a &^ Readable 使用 按位置零 的技巧,可以把 Readable 权限干掉。
func TestBitClear(t *testing.T) {
  a := 7 // 0111
  a = a &^ Readable
  t.Log(a&Readable == Readable)
  t.Log(a&Writable == Writable)
  t.Log(a&Executable == Executable)
}

输出

=== RUN   TestBitClear
--- PASS: TestBitClear (0.00s)
false
true
true

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Nov 7, 2019

奉献爱心