go - 为什么在 golang 中使用按位与比较?
问题描述
我正在阅读这样的一段代码(取自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|...) 值?
解决方案
这是位掩码的一个示例。他们正在做的是定义一系列掩码(创建、删除、写入),它们是整数 1、2、4、8、16、32 等。您传入一个可以有多个操作的操作值,它会根据翻转的位来确定要执行的操作。如果您以按位模式考虑这些数字,这将更有意义。4 == 00000100,移除的值。如果您传入一个操作码 6,当您比较 00000110 && 00000100 == 00000100 时,您会得到正确的结果,因为特定于 Remove 的位(第三个最低有效位)是 1。
以一种不那么行话和具体的方式,这基本上是一种用一个字节传递多个操作码的方法。他们进行按位与然后比较的原因是因为它允许他们检查该特定位是否被翻转,而忽略其余位。
推荐阅读
- swift-playground - 在 Swift 中排序字典
- jmeter - Jmeter 插件没有显示结果
- android - 如何为本地 Maven 存储库 \\user023\share\folder 放置网络路径
- angular - Ionic 4 无法从标签页导航到非标签页,直到应用程序重新启动或 location.reload()
- android - Android Studio - Listview OnClick 激活多个复选框
- javascript - 如何防止 application.hbs 出现在其路由中
- docker - 用于从多个容器访问的 Windows 10 docker 公共 IP 地址
- python-3.x - 无法导入 netmiko 模块
- c# - 如何防止 .net 中的危险字符
- c# - 如何在其他括号字符串中匹配带有嵌套括号的字符串?