我正在阅读一段这样的代码(摘自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:]
}
我的 newbie 问题是为什么有人会使用op&Remove == Remove
之类的按位AND运算来进行实际比较。
为什么不只比较op和(Create | Remove | ...)值?
答案 0 :(得分:3)
这是bit masking的示例。他们正在做的是定义一系列掩码(创建,删除,写入),它们是整数1,2,4,8,16,32等。您传入一个可以有多个操作的op值,它会根据翻转的位确定要执行的操作。如果您按位模式考虑这些数字,则更有意义。 4 == 00000100,表示删除的值。如果您输入的操作码为6,则当比较00000110 && 00000100 == 00000100时,您将得到true,因为特定于Remove的位(第三低有效位)为1。
以较少的术语和特定的方式,这基本上是一种传递一个字节的多个操作码的方式。他们之所以进行按位与然后比较的原因是因为它允许他们检查特定位是否被翻转,而忽略其余位。