среда, 3 июня 2009 г.

25971883

Приписать по единице в начало и конец двоичной записи натурального числа.


давно это было... но попытаемся что-нибудь прояснить в памяти...



  1. определимся сначала что есть натуральные числа - это целые, бесзнаковые
  2. где можно хранить такие числа? ну например в регистрах AL, AX, EAX (8 бит, 16 бит, 32 бита соотв.), это значит что натуральное число может храниться в ячейках разного размера и то что число может быть ограничено соотв. диапазоном значений... но для примера возьмём 8-битное число, т.е. то которое влазит в AL - т.е. байт
  3. итак мне лично нравится число 10 - его двоичное педставление 1010b
  4. я так понимаю что на выходе должно получиться 110101b
  5. ту единичку, которая зелёная можно получить путём сдвига всего числа влево и прибавлением единицы... т.е.

    mov al, 1010b
    shl al, 1
    inc al

  6. ну а ту что красная... тут наверное есть несколько способов, но мне кажется самый очевидный - это подсчитать сколько значащих разрядов в числе, а потом на такое же кол-во + 1 сдвинуть вправо единицу, ну и полученный результат проORить с исходным значением...

  7. итак попробуем подсчитать кол-во начащих символов, будем сдвигать наше число (предварительно сохранив его где-нибудь) вправо - после сдвига проверяем флаг Zero - т.е. что число не стало нулём, если не стало увеличиваем счётчик на 1 и снова сдвигаем...

    mov al, 1010b ;инициализируем al нашим числом
    mov ah, al ;сохраним значение al в ah
    mov cx, 0 ;обнуляем счётчик

    ; подсчитываем кол-во значащих разрядов в нашем числе путём сдвига
    m1:
    shr al, 1
    jz m2 ; если флаг ZF выставлен - то значение al = 0, следовательно выходим
    inc cx
    jmp m1

    m2:

    inc cx ; увеличим ещё на один - чтобы единичка стала красной ;-)

    ; теперь двигаем на cx-раз 1 влево
    m3:
    mov al, 1
    shl al, 1
    dec cx
    jnz m3

    ; тут думается что al = 10000b

    ; тут OR-им, т.е. накладывает нашу единичку
    or al, ah

    ; тут подразумеваем что al уже в виде 11010b



исходников которые можно было бы скомпилировать не прилагаю, т.к не знаю какой OS вы пользуетесь и каким ассемблером... да и подзабыл я уже немного :-))
на этом всё.

Комментариев нет:

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