Циклический сдвиг 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

Facebook

Twitter

  • No Comments

Группа в VK

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Облако меток

Похожие статьи

Команды работы с битами.

Работать с отдельными битами операндов можно, используя логические операции и сдвиги. Также в системе команд x86 существуют специальные команды для работы с битами: это команды

Основы создания макросов в Assembler.

Макросы — это шаблоны для генерации кода. Один раз создав макрос, можно использовать его во многих местах в коде программы. Макросы делают процесс программирования на

Синтаксис объявления меток.

Метка в ассемблере – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду. Метка может содержать следующие символы: Буквы (от A до Z и

Локальные переменные.

Локальные переменные в Assembler используются для хранения промежуточных результатов во время выполнения процедуры. В отличие от глобальных, эти переменные являются временными и создаются при запуске

Instagram Vk Youtube Telegram Odnoklassniki

Полезно знать

Рубрики

Авторы

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

Купить бензопилу недорого на сайте.

Команда rol осуществляет сдвиг влево всех битов операнда. Если команда записана в формате

rol операнд,1

сдвиг осуществляется на 1 бит. Старший бит операнда загружается в его младший разряд и одновременно заносится в флаг CF (рис. П6). Если команда записана в формате

rol операнд,CL

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

Рис. П6. Действие команды rol.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF.

Пример 1


mov AX,1
rol AX,1 ;AX=0002h, CF=0

Пример 2


mov DL,8 Oh
rol DL,1 ;DL=01h, CF=1

Пример 3


mov DX,3000h
mov CL,4
rol DX,CL ;DX=0003h, CF=1

Пример 4


mov DX,2000h
mov CL,4
rol DX,CL ;DX=0002h, CF=0

!!! Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.

Пример


mov ЕАХ,012345678h
rol EАХ,16 ;EAX=56781234h

 

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


Команда ROR осуществляет циклический сдвиг вправо всех битов операнда. Если команда записана в формате

ror операнд,1

сдвиг осуществляется на 1 бит. Младший бит операнда записывается в его старший разряд и одновременно поступает в флаг CF (рис.Ш). Если команда записана в формате

ror операнд,CL

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

Рис. П7. Действие команды ror.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF.

Пример 1


mov AX,2
ror AX,1 ;AX=0001h, CF=0

Пример 2


mov DL,81h
ror DL,1 ;DL=C0h, CF=1

Пример 3


mov BX,000Eh
mov CL,4
ror BX,CL ;BX=E000h, CF=1

Пример 4


mov BX,0009h
mov CL,4
ror BX,CL ;BX=9000h, CF=1

!!! Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.

Пример


mov EDI,90000001h
ror EDI,12 ;EDI=00190000h

 

SAHF Запись содержимого регистра АН в регистр флагов


Команда sahf копирует разряды 7, 6, 4, 2 и 0 регистра АН в регистр флагов процессора, устанавливая тем самым значения флагов SF, ZF, AF, PF и CF соответственно. Команда не имеет операндов.
Команда sahf (совместно с командой lahf) дает возможность читать и изменять значения флагов процессора, в том числе флагов SF, ZF, AF и PF, которые нельзя изменить непосредственно. Однако следует иметь в виду, что команда sahf заполняет только младший байт регистра флагов. Поэтому нельзя изменить с ее помощью, например, состояние флага OF.

Пример 1


lahf ;Регистр АН отображает
;состояние регистра флагов
or АН,80h ;Установка бита 7 = SF
sahf ;Загрузка АН в регистр
;флагов, где теперь будет SF = 1

Пример 2


lahf ;Регистр АН отображает
;состояние регистра флагов
and АН,0BFh ;Сброс бита 6 = ZF
sahf ;Загрузка АН в регистр
;флагов, где теперь будет ZF = 0

Пример 3


mov АН, 5
sahf ;Устанавливаются флаги PF и
;CF и сбрасывается флаги SF,
;ZF и AF

 

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


Команда sal осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате

sal операнд, 1

сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате

sal операнд,CL

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

Рис. П8. Действие команды sal.

В качестве операнда команды sal можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду sal удобно использовать для возведения операнда в степень 2.
Команда воздействует на флаги OF, SF, ZF, PF и CF.

Пример 1


mov AL,7
sal AL,1 ;AL= 0Eh=7*2, CF=0

Пример 2


mov AX,IFh
mov CL,8
sal AX,CL ;AX=lF00h=lFFh*256, CF=0

Пример 3


mov SI,-1 ;SI=FFFFh
mov CL,4
sal SI,CL ;SI=FFF0h=-l*16=-16, CF=1

!!! Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.

Пример


mov EBX,0000C835h
sal EBX,5 ;EBX=001906A0h

 

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


Команда sar осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате

sar операнд,1

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

sar операнд,CL

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

Рис. П.9. Действие команды sar.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду sar удобно использовать для деления операнда на целые степени 2. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Пример 1


mov AL,7
sar AL,1 ;AL=3=7/2, CF=1. Остаток
;потерян

Пример 2


mov AX,lFF0h
mov CL,4
sar AX,CL ;AX=01FFh=lFF0h/16, CF=0

Пример 3


mov BX,-8 ;BX=FFF8h
mov CL,2
sar BX,CL ;BX=FFFEh=-2=-8/4, CF=0

!!! Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.

Пример


mov EAX,0F0001234h
sar EAX,8 EAX=FFF00012h

назад — Вперёд

Сдвиг и поворот битов — онлайн-инструменты

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

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

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

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

9 n , где n — количество шагов, если результат соответствует количеству используемых битов. Если умножение или деление можно заменить операцией сдвига, то компьютер будет вычислять немного быстрее.

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

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

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

Арифметический сдвиг подходит для целых чисел со знаком (т.

Арифметический сдвиг влево идентичен логическому сдвигу влево и может использоваться таким же образом для умножения как положительных, так и отрицательных значений на два.

При арифметическом сдвиге вправо новые биты получают то же значение, что и знаковый бит (самый левый бит). Это гарантирует, что знак (+/−) остается одинаковым до и после. Один шаг с арифметическим сдвигом вправо составляет , почти , то же самое, что целочисленное деление на два. Разница в том, что результат всегда округляется в меньшую сторону (в сторону минус бесконечности), а не в сторону нуля.

Круговой сдвиг

Круговой сдвиг влево

Круговой сдвиг вправо

Круговые сдвиги, также называемые поворотами другой конец. Циклические сдвиги часто используются для криптографических приложений и подходят, когда желательно не потерять значения битов.

Поворот через перенос

Поворот влево через перенос

Вращение вправо через перенос

Значение последнего сдвинутого бита обычно хранится во флаге переноса. Специальный тип циклического сдвига, называемый поворотом через перенос , использует старое значение этого флага для бита, который смещается. Например, если компьютер может выполнять сдвиги только для 32 бит за раз, но мы хотим выполнить арифметический сдвиг вправо для 64-битного значения, мы можем выполнить вычисления в два этапа. Сначала мы выполняем арифметический сдвиг вправо на половине, содержащей самые значащие биты. Смещенный бит будет сохранен во флаге переноса. Чтобы закончить вычисление, мы затем выполняем поворот через перенос операции на вторую половину.

Есть ли у Джулии побитовый циклический сдвиг? — Общее использование

Lucas_Queiroz

1

На этой странице документации перечислены логический и арифметический сдвиг, а также побитовые НЕ, И, ИЛИ и XOR. Однако круговое смещение отсутствует.

Есть ли у Джулии побитовый циклический сдвиг? Если да, то где я могу найти его документацию? Если нет, можно ли реализовать его с производительностью, аналогичной другим побитовым операциям?

Оскар_Смит

2

Я не думаю, что он существует, но для Int64 он должен работать и быть примерно в 3 раза медленнее, чем другие битовые сдвиги (поскольку он использует 3 из них). Вы могли бы достаточно легко написать методы для других типов Integer , но я не знаю способа в Джулии автоматически получить количество битов в целом числе.

 функция circshift(x, n)
    возврат (x<>(muladd(8, sizeof(x), -n)
конец
 

EDIT: теперь должно работать для любого Integer подтипа

1 Нравится

3 августа 2020 г. , 22:30

3

Оскар_Смит:

но я не знаю как в Джулии автоматически получить количество битов в целом

sizeof(x) или sizeof(typeof(x)) дает количество байтов

1 Нравится

грег_пахарь

4

Горячее издание: битротация

https://docs.julialang.org/en/v1.5/base/math/#Base.bitrotate

 помощь?> битротация
поиск: битрейт
  битротация (x::Base.BitInteger, k::Integer)
  bitrotate(x, k) реализует побитовое вращение. Он возвращает значение x с его битами, повернутыми влево k раз. Вместо этого отрицательное значение k будет вращаться вправо. 
  │ Юлия 1.5
  │
  │ Для этой функции требуется Julia 1.5 или более поздняя версия.
  Юлия> битротация (UInt8 (114), 2)
  0xc9Юлия> битовая строка (битротация (0b01110010, 2))
  "11001001"
  Юлия> битовая строка (битповорот (0b01110010, -2))
  "10011100"
  юлия> битовая строка (битротация (0b01110010, 8))
  "01110010"
 

11 лайков

Оскар_Смит

5

 (x << ((sizeof (T) << 3 - 1) & k)) | (x >>> ((sizeof(T) << 3 - 1) & -k))
 

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

1 Нравится

Lucas_Queiroz

Оставить комментарий

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

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