Реализация поворота влево с использованием операций AND, NOT и ADD - PullRequest
6 голосов
/ 01 марта 2011

Я реализую 16-битный битовый сдвиг, чтобы повернуть биты влево на r .У меня есть доступ только к операциям AND, NOT и ADD.Существует 3 кода состояния: отрицательный , ноль и положительный , которые устанавливаются при использовании любой из этих операций.

Это мой подход:

  1. AND число с 1000 0000 0000 0000 для установки кодов состояния на положительный , если старший бит 1,
  2. ADD номер с самим собой.Это сдвигает биты влево на единицу.
  3. Если MSB был 1, ADD 1 к результату.
  4. Выполните шаги (1) - (3) r раз.

Есть ли другие эффективные способы сделать это?

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Поскольку это домашняя работа, я помогу вам подумать об этом.

2 * 2 = 4
4 * 2 = 8
8 * 2 = 16

0010 * 0010 = 00100
0100 * 0010 = 01000
1000 * 0010 = 10000

Сдвиг влево - это [какая-то неизвестная] операция.Эта [некоторая неизвестная] операция может быть реализована с использованием AND, NOT и ADD, выполнив ...

0 голосов
/ 02 марта 2011

Вот код x86, с которого можно начать:

; I'm assuming the number you want to rotate is in ax
; I'm assuming the number of bits to rotate is in cx
loop_start:
  add cx, -1                  ; Can only use add, so add -1
  jo loop_end                 ; If cx is < 0
  mov bx, ax                  ; Copy ax into bx
  add ax, ax                  ; shift ax left 1 bit
  and bx, 1000000000000000b   ; Test the msb of bx
  jz loop_start               ; if the msb is zero, jump
  add ax, 1                   ; if the msb is one, add one to ax
  jmp loop_start              ; Loop
loop_end:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...