Swift: Операции с битами

— оператор NOT (логическое НЕ, инвертирует все биты, ~)

UInt8 — целые беззнаковые числа в диапазоне от 0 до 255

— оператор AND (логическое И, выдаст 1, если оба бита = 1, &)

— оператор OR (логическое ИЛИ, выдаст 1 если хоть один бит = 1, ||)

— оператор XOR (логическоле ИЛИ-НЕ, выдаст 1 если биты разные, 0 и 1, иначе 0, ^)

— операторы побитового сдвига целых чисел влево << и вправо >>
По сути равно умножению на два при сдвиге влево, и делению на 2 (с отбрасыванием единицы если число было нечетным) при сдвиге вправо

Для беззнаковых все довольно просто.

Сдвиг влево

За скобки я вынес единицу которая грубо говоря пропадает. Чтобы была понятна природа сдвига — берем ноль справа (считаем что и слева и справа от числа идет нулевой бит) дописываем его справа и отбрасываем последний бит слева. Равноценно умножению на 2.

Сдвиг вправо

При сдвиге вправо ноль добавляется уже слева и отбрасываем последний правый бит. Как я уже упоминал равноценно делением на два нацело.

Сдвиги можно применять чтобы выделить часть составного значения. К примеру цвет можно закодировать как 3х-компонентное число (пресловутое RGB), чтобы из такого числа получить конкретные части красного, зеленого и синего цветов соответственно пригодится система сдвигов.

К примеру разберем let greenComponent = (pink & 0x00FF00) >> 8
Сначала мы выполняем побитовое сложение над числом и маской 0x00FF00, выделяем таким образом именно зеленый цвет, но нам нужно получить число от 0 до 255 (0x00 — 0xFF), а мы получаем (0x00000xFF00). 0x00 равно в битовом эквиваленте 00000000, т.е. 8 бит, и на них мы и сдвигаем вправо командой >> 8

Сдвиги для знаковых чисел.

С ними все посложнее. Рассмотрим внутреннее устройство знакового восьмибитного числа.
Первый бит отводится под знак, если 0 — число положительное, если 1 — отрицательное. Таким образом знаковое число имеет диапазон (-127…128)

К примеру в Int8 4 будет представлено так
00000100 (жирным выделил знаковый бит)

Отрицательные числа же представлены не просто инвертированием знакового бита, как можно было бы предположить. В знаковый бит записывается 1, а в оставшиеся биты значения — результат выражения 2^n — abs(value).
Возьмем -4
Абсолютное значение abs(-4) = 4 = 0000100
n — равно числу битов в числе (не учитывая знаковый). Т.е. для 8битного числа n = 7, 2^n = 128 = 10000000

Итого

Данное представление используется потому, что арифметические действия над такими числами производятся обычным путем. К примеру произведем сложение -1 и -4

Производить сдвиги для знаковых числе благодаря такому представлению не сложнее чем для беззнаковых, нужно лишь при сдвиге вправо в качестве нового старшего бита брать не всегда 0, а текущий знаковый бит

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *