我正在阅读一段这样的代码(取自 fsnotify ):
type Op uint32
const (
Create Op = 1 << iota
Write
Remove
Rename
Chmod
)
...
func (op Op) String() string {
var buffer bytes.Buffer
if op&Create == Create {
buffer.WriteString("|CREATE")
}
if op&Remove == Remove {
buffer.WriteString("|REMOVE")
}
if op&Write == Write {
buffer.WriteString("|WRITE")
}
if op&Rename == Rename {
buffer.WriteString("|RENAME")
}
if op&Chmod == Chmod {
buffer.WriteString("|CHMOD")
}
if buffer.Len() == 0 {
return ""
}
return buffer.String()[1:]
}
我的 新手 问题是为什么有人会使用像 op&Remove == Remove
这样的按位与操作来实际进行比较。
为什么不只比较 op 和 (Create|Remove|...) 值?
最佳答案
这是 bit masking 的示例.他们正在做的是定义一系列掩码(创建、删除、写入),它们是整数 1、2、4、8、16、32 等。您传入一个 op 值,它可以有多个操作,它会根据翻转的位确定要执行的操作。如果您以按位模式考虑这些数字,这会更有意义。 4 == 00000100,删除的值。如果你传入一个操作码 6,当你比较 00000110 && 00000100 == 00000100 时你得到 true,因为特定于 Remove 的位,第三个最低有效位,是 1。
用一种不那么专业和具体的方式,这基本上是一种用一个字节传递多个操作码的方式。他们进行按位与然后比较的原因是因为它允许他们检查特定位是否被翻转,同时忽略其余位。
关于go - 为什么要比较在 golang 中使用按位与?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52500422/