【发布时间】:2019-03-01 05:02:40
【问题描述】:
我正在阅读这样一段代码(取自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|...) 的值呢?
【问题讨论】:
-
因为您可以指定多个要设置的标志。 op 是一个位模式,如果有人通过 0001010,可以说位 4 表示“重命名”,位 2 表示“写入”,这不等于重命名为 0001000,也不等于写入为 00000010。测试是否设置了重命名位您必须将其与重命名并测试结果是否为非零。与重命名、写入等比较在这里并不重要,可以用 != 0 代替。
-
您了解
iota的工作原理吗?你知道Create、Write、Remote等的值是什么吗?一旦你明白了,为什么你想使用&而不是检查相等性可能会变得更清楚...... -
感谢@Volker!将
op&operation与 not 零进行比较更直接。我虽然这段代码op&operation==operation是某种惯用语。
标签: go bitwise-operators bitwise-and