Инверсия и сброс битов в Go
Инверсия переворачивает каждый бит, а сброс
гасит только биты, отмеченные маской. В Go
нет отдельного знака тильды, как в некоторых
языках: все разряды меняют, записав ^
перед одним числом.
Сброс делают через &^: это И-НЕ, оно
обнуляет те разряды, где в маске единица,
а остальные копирует из исходного числа.
Инвертируем число и посмотрим двоичный вид:
x := 5
inv := ^x
fmt.Println(inv)
fmt.Printf("%b %b\n", x, inv)
Для беззнакового типа результат зависит от
ширины типа. В примере с int на
64-разрядной платформе инверсия
5 дает большое отрицательное число,
потому что старший разряд становится единицей.
Сбросим младшие два разряда маской 3:
flags := 15
mask := 3
cleared := flags &^ mask
fmt.Println(cleared)
fmt.Printf("%b %b\n", flags, cleared)
Даны числа:
v := 8
Инвертируйте все разряды v
и запишите результат для типа uint8
(8 бит).
Даны числа:
n := 13
m := 4
Сбросьте биты n там, где в m
единица, и запишите результат.
Дан следующий код:
a := 7
b := ^a
Скажите, сколько операндов у знака
перед a в строке с b.