Зачем сравнивать использование побитового И в Голанге? - PullRequest
0 голосов
/ 25 сентября 2018

Я читаю такой фрагмент кода (взято из 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 Ответ

0 голосов
/ 25 сентября 2018

Это пример битовой маскировки .Что они делают, так это определяют серию масок (Create, Remove, Write), которые являются целыми числами 1,2,4,8,16,32 и т. Д.Вы передаете одно значение операции, которое может иметь несколько операций, и оно определяет, какую операцию выполнить, на основе какого бита переворачивается.Это имеет больше смысла, если вы думаете об этих числах в побитовом порядке.4 == 00000100, значение для Удалить.Если вы передадите код операции, скажем, 6, при сравнении 00000110 && 00000100 == 00000100 вы получите значение true, поскольку бит, относящийся к типу Remove, третьему младшему значащему биту, равен 1.

Inменее грубый и конкретный способ, это в основном способ передать несколько кодов операций с одним байтом.Причина, по которой они выполняют побитовое И, а затем сравнивают, заключается в том, что он позволяет им проверять, был ли перевернут этот конкретный бит, игнорируя при этом остальные биты.

...