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

Эмуляция операторов SAR, ROR, ROL в Delphi

Июль 14, 2010 — Шарахов А.П.

Среди логических операторов Delphi нет операторов SAR (арифметический сдвиг вправо), ROR (циклический сдвиг вправо), ROL (циклический сдвиг влево). В качестве альтернативы отсутствующим операторам обычно используют вызовы ассемблерных функций:

 
function sar32(value, shift: longint): longint;
asm
  mov ecx, edx
  sar eax, cl
  end;
 
function ror32(value, shift: longint): longint;
asm
  mov ecx, edx
  ror eax, cl
  end;
 
function rol32(value, shift: longint): longint;
asm
  mov ecx, edx
  rol eax, cl
  end;

Но можно поступить иначе – сэмулировать их при помощи операторов Delphi:

 
//res := sar32(value, shift);
res := (value and MaxLongInt) shr shift - (value and (not MaxLongInt)) shr shift;
 
//res := sar32(value, shift);
mask := -(value shr 31);
res := (value xor mask) shr shift xor mask;
 
//res := ror32(value, shift);
res := value shr shift or value shl -shift;
 
//res := rol32(value, shift);
res := value shl shift or value shr -shift;

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

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

Способ эмуляции операторов ROR и ROL достаточно известен. Значение переменной сдвигается в обоих направлениях и полученные результаты соединяются оператором OR. Иногда можно видеть, что в качестве величины сдвига в направлении, противоположном вращению, указано выражение 32-shift. Первое слагаемое (32) можно опустить, т.к. все равно величина сдвига 32-битной переменной процессором приводится по модулю 32.

Интересно, что эмуляция быстрее вызова ассемблерной функции и ассемблерной вставки (см. Давай сделаем это медленно).

на главную

Ответить

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <h1> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <pre>, <code>, <asm>, <c>, <cpp>, <delphi>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>, <mytext>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Подробнее о форматировании

CAPTCHA
Ведите текст с изображения. (вводить еще раз после предпросмотра а то не добавится комментарий)
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.