go - 为什么要比较在 golang 中使用按位与?

标签 go bitwise-operators bitwise-and

我正在阅读一段这样的代码(取自 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/

相关文章:

go - 从结构 slice 动态创建 map[string]struct 的常用函数

c# - 是否有内置函数来反转位顺序

sql - 为什么 SQL Server 中 SELECT 2^3 返回 1?

mysql - JPA @NamedQuery 以按位 AND (&) 作为条件

c# - 帮助进行位运算

go - 将数据库凭据传递给测试?

go - 如何根据结构字段类型键入值?

c - 按位运算和移位

python - 为什么在 OpenCV Python 中按位发送错误?

arrays - 什么是二维数组内存表示法?