Каков математический эквивалент левого вращения? - PullRequest
4 голосов
/ 03 августа 2011

Я пытаюсь расшифровать некоторый ассемблерный код, который включает несколько поворотов влево на 8-битном двоичном числе.

Для справки, код:

lab:    rol    dl,1
        rol    dl,1
        dec    ecx
        jnz    lab

dec и jnz не проблема, но есть, чтобы показать, что 2 rol s выполняются несколько раз.

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

Я пытался выяснить это с помощью нескольких разных чисел, но не вижу связи между двумя результатами. Например: если начальный номер равен 115, он равен 220, но если начальный номер равен 99, он равен 216.

Ответы [ 2 ]

8 голосов
/ 03 августа 2011

Учитывая ваши результаты выборки, я предполагаю, что мы рассматриваем 8-битное количество как беззнаковое.

7 младших битов сдвинуты влево, умножив эту часть числа на 2; и бит старшего разряда меняется на начало.

Таким образом, (x % 128) * 2 + (x / 128), используя обычные целочисленные операторы div / mod.

0 голосов
/ 03 августа 2011

Сдвиг байта, содержащего число X, на один бит (позиция) влево равен умножению числа X на 2:

x << 1 <==> x = x * 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...