首页 > 解决方案 > 为什么在 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|...) 值?

标签: gobitwise-operatorsbitwise-and

解决方案


这是位掩码的一个示例。他们正在做的是定义一系列掩码(创建、删除、写入),它们是整数 1、2、4、8、16、32 等。您传入一个可以有多个操作的操作值,它会根据翻转的位来确定要执行的操作。如果您以按位模式考虑这些数字,这将更有意义。4 == 00000100,移除的值。如果您传入一个操作码 6,当您比较 00000110 && 00000100 == 00000100 时,您会得到正确的结果,因为特定于 Remove 的位(第三个最低有效位)是 1。

以一种不那么行话和具体的方式,这基本上是一种用一个字节传递多个操作码的方法。他们进行按位与然后比较的原因是因为它允许他们检查该特定位是否被翻转,而忽略其余位。


推荐阅读