Циклический сдвиг c: c++ — Реализовать циклический сдвиг вправо на K разрядов

Циклический сдвиг. — it-black.ru

Циклический сдвиг. — it-black.ru

Циклический сдвиг отличается от линейного тем, что выдвигаемые с одного конца биты вдвигаются с другой стороны, то есть движутся по кольцу. В процессора x86 существует 2 вида циклического сдвига: простой и через флаг переноса (CF).

Простой циклический сдвиг

Циклический сдвиг вправо выполняется командой ROR, а влево — командой ROL. При этом старший (для ROL) или младший (для ROR) бит операнда вдвигается в операнд справа (для ROL) или слева (для ROR) и становится значением младшего (для ROL) или старшего (для ROR) бита операнда; одновременно выдвигаемый бит становится значением флага переноса CF. Указанные действия повторяются количество раз, равное значению второго операнда. Примеры использования команд:


rol bl,1        ;Циклический сдвиг BL на 1 бит влево
ror word[si],5  ;Циклический сдвиг слова по адресу в SI на 5 бит вправо
rol ax,cl       ;Циклический свдиг AX на CL бит влево
Циклический сдвиг через флаг переноса

Циклический сдвиг через флаг переноса отличается от простого циклического сдвига в том, что флаг CF участвует в сдвиге наравне с битами операнда. При сдвиге на 1 бит выдвигаемый бит помещается в CF, а значение CF вдвигается в операнд с другой стороны. При сдвиге на несколько бит эта операция повторяется многократно. Циклический сдвиг через флаг переноса выполняется командами RCR (вправо) и RCL (влево). Примеры использования команд:


rcr dh,3        ;Цикл. сдвиг DH на 3 бита вправо через флаг CF
rcl byte[bx],cl ;Цикл. сдвиг байта по адресу в BX на CL бит влево через флаг CF
rcl dx,1        ;Цикл. сдвиг DX на 1 бит влево через флаг CF