Битовый сдвигБи́товый сдвиг — изменение позиций бит в машинном слове. Большинство компьютеров не могут напрямую адресовать биты, которые содержатся группами по 8, 16, 32 или 64 бита в машинном слове. Для обеспечения работы с битами существует множество машинных инструкций, включающие различные типы сдвигов. Все сдвиги похожи друг на друга поведением средних битов, которые просто сдвигаются влево или вправо на определённую величину. Однако, поведение крайних битов, которые уходят из слова и которые появляются в слове, зависит от типа сдвига. В электронике битовые сдвиги выполняются на сдвиговых регистрах. Логический (беззнаковый) сдвигСдвиг, при котором уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается бит 0. Пример работы операции сдвига:
В большинстве процессоров уходящий бит сохраняется во флаге переноса. Эта функция широко используется при работе с многобайтовыми числами. Арифметический (знаковый) сдвигПри этом сдвиге слово рассматривается не просто как группа битов, а как целое число в дополнительном коде. При сдвиге влево ведёт себя как логический сдвиг, при сдвиге вправо уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита устанавливается бит, соответствующий знаку. Пример № 1Пример работы операции сдвига 8 битного числа в прямом коде:
Пример № 2Пример работы операции сдвига 8 битного числа записанного в дополнительном до 2х коде:
ВыводЛегко заметить, что при арифметическом сдвиге сдвиг влево соответствует умножению на 2, а сдвиг вправо — делению на 2 (в общем случае — на основание системы счисления) с округлением к −∞. Например: 1011 = −5 1111 = −1 >>a 1 >>a 1 ---- ---- 1101 = −3 1111 = −1 Схемотехническая реализация операций сдвига очень проста. Именно поэтому эти операции рекомендуют использовать для операций умножения и деления целых чисел на числа, равные степени 2 (2, 4, 8, 16, 32, 64 и т. д.) — если, конечно, такое округление отрицательных чисел не мешает. Циклический сдвигПри этом сдвиге уходящий бит появляется на месте появившегося свободного на другом конце числа. Широко используется в криптографии. Пример
Циклический сдвиг через бит переносаВ архитектуру многих процессоров входит флаг переноса в следующий разряд (например, Например, если у нас в регистре число 11111010b, флаг переноса циклического сдвига вправо равен 0.
Операция циклического сдвига через бит переноса используется при работе с многобайтовыми числами. В частности, чтобы сдвинуть вправо на 1 бит длинное число, нужно очистить[1] Было: HI=0110, MED=0011, LO=1100, cf=0 После сдвига HI: HI=0011, MED=0011, LO=1100, cf=0 После сдвига MED: HI=0011, MED=0001, LO=1100, cf=1 После сдвига LO: HI=0011, MED=0001, LO=1110, cf=0 Сдвиги через регистр флагов более чем на 1 бит практически не используются. См. такжеПримечания
Ссылки
|