Циклический сдвиг через бит переноса




Логический сдвиг

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

Пример работы операции сдвига:

· Пусть у нас есть число 10101010b (в двоичной системе).

· Если сделать сдвиг влево на 1 бит, то получим число 01010100b.

· Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 01010101b.

В большинстве процессоров уходящий бит сохраняется во флаге переноса. Эта функция широко используется при работе со многобайтовыми числами.


Логический сдвиг влево Логический сдвиг вправо

Арифметический сдвиг

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

 


Арифметический сдвиг влево Арифметический сдвиг вправо

Пример №1

Пример работы операции сдвига 8 битного числа в прямом коде:

· Пусть у нас есть 8 битное число: 0000 0010b = 2. (записанное в двоичной системе, в прямом коде).

· Cдвиг влево на 1 бит, дает число: 00000100b = 4.

· Сдвиг вправо на 1 бит, дает число: 00000001b = 1.

Пример №2

Пример работы операции сдвига 8 битного числа записанного в дополнительном до 2х коде:

· Пусть у нас есть число 11111010b = −6 (в двоичной системе, в дополнительном коде).

· Если сделать сдвиг влево на 1 бит, то получим число 11110100b = −12.

· Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 11111101b = −3.

Циклический сдвиг

При этом сдвиге уходящий бит появляется на месте появившегося свободного на другом конце числа.


Циклический сдвиг влево Циклический сдвиг вправо

Пример

  • Пусть у нас есть число 11111010b (в двоичной системе).
  • Если сделать сдвиг влево на 1 бит, то получим число 11110101b.
  • Если сделать сдвиг вправо на 1 бит, то получим число 01111101b.

Циклический сдвиг через бит переноса

При нём первый бит по направлению сдвига получает значение из бита переноса, а значение последнего бита сдвигается в бит переноса.

В архитектуру многих процессоров входит флаг переноса в следующий разряд (например, cf на x86). Данная операция выполняет циклический сдвиг над (n+1)-битным числом, состоящим из регистра и флага переноса.

 

 

Флаг переноса CF (англ. Carry flag) в микропроцессорах — битовый флаг, который устанавливается, если в результате арифметической операции в (n + 1)-м значащем бите появилась единица (соответственно, в результате двоичного сдвига из разрядной сетки ушла единица).

Например, если у нас в регистре число 11111010b, флаг переноса циклического сдвига вправо равен 0.

После сдвига влево на 1 бит в регистре 11110101b, флаг переноса равен 1.

После сдвига вправо на 1 бит в регистре 01111101b, флаг переноса равен 1.

Операция циклического сдвига через бит переноса используется при работе с многобайтовыми числами. В частности, чтобы сдвинуть вправо на 1 бит длинное число, нужно очистить[1] cf (в случае деления числа со знаком нужно записать в cf старший бит старшего слова) и циклически сдвинуть на единицу через cf каждое слово, начиная с верхнего. Например, пусть у нас есть число 011000111100b, занимающее три 4-битных слова:

 

Было: 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 бит практически не используются.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-09-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: