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
- 如果 y 非零,则 z 为 0
- 如果 y 为零,则 z 为 x
实际场景
- 使用 iota 先设置a3 个权限常量当作权限值。
a
记录当前用户的权限集合- 将 a 和 权限常量 进行 按位与 运算(两位同时为 1,结果才为 1,否则为 0)。
- 通过这个小技巧,我们可以判断出用户是否拥有某项权限。
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)
}
- 重新将权限集合设置为
0111
,也就是拥有上面列出的所有权限。 - 使用
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