Как бы вы установили и очистили один бит в Go?

В Golang, как вы устанавливаете и очищаете отдельные биты целого числа? Например, функции, которые ведут себя следующим образом:

 clearBit(129, 7) // returns 1
 setBit(1, 7)     // returns 129

Ответы

Ответ 1

Здесь функция для установки бит. Во-первых, сдвиньте число 1 заданное количество пробелов в целое число (таким образом, оно станет 0010, 0100 и т.д.). Затем OR с исходным входом. Это оставляет другие биты незатронутыми, но всегда будет устанавливать целевой бит в 1.

// Sets the bit at pos in the integer n.
func setBit(n int, pos uint) int {
    n |= (1 << pos)
    return n
}

Здесь функция, чтобы очистить бит. Сначала сдвиньте число 1 заданное количество пробелов в целое число (так что оно станет 0010, 0100 и т.д.). Затем переверните каждый бит в маске с помощью оператора ^ (поэтому 0010 станет 1101). Затем используйте побитовое И, которое не касается чисел AND 'ed с 1, но которое отключит значение в маске, которое установлено на 0.

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    mask := ^(1 << pos)
    n &= mask
    return n
}

Наконец, здесь функция, чтобы проверить, установлен ли бит. Сдвиньте число 1 на указанное количество пробелов (так оно станет 0010, 0100 и т.д.), А затем И с целевым номером. Если итоговое число больше 0 (это будет 1, 2, 4, 8 и т.д.), Тогда бит будет установлен.

func hasBit(n int, pos uint) bool {
    val := n & (1 << pos)
    return (val > 0)
}

Ответ 2

Существует также компактная нотация, чтобы немного очистить. Оператор для этого &^ и называется "и не".

Используя этот оператор, функция clearBit может быть записана следующим образом:

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    n &^= (1 << pos)
    return n
}

Или вот так:

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    return n &^ (1 << pos)
}