Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 13 из 13

Тема: asm: x mod 3 ?

  1. #11
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alone Посмотреть сообщение
    Умножить на 85 (%1010101) и сдвинуть на 8 бит.
    Теория правильная, но на практике, если этой программой 3 разделить на 3 получится 0.
    Если аргумент меньше 128 то можно так (умножая на 86):
    Код:
     ; аргумент А, результат H
     rlca      ;4 (98 тактов)
     ld l,a    ;4
     ld h,0    ;7
     rlca      ;4
     rlca      ;4
     rlca      ;4
     ld e,a    ;4
     and 7    ;7
     ld d,a    ;4
     xor e     ;4
     ld e,a    ;4
     add hl,de ;11
     ex  de,hl ;4
     add hl,de ;11
     add hl,hl ;11
     add hl,de ;11
    Если аргумент меньше 255 то можно так (предварительный инкремент):
    Код:
    ; аргумент А, результат H
     inc a     ;4 (107 тактов)
     ld l,a    ;4 
     ld h,0    ;7
     rrca      ;4
     rrca      ;4
     rrca      ;4
     rrca      ;4
     ld e,a    ;4
     and 15    ;7
     ld d,a    ;4
     xor e     ;4
     ld e,a    ;4
     add hl,de ;11
     ld d,h    ;4
     ld e,l    ;4
     add hl,de ;11
     add hl,hl ;11
     add hl,de ;11

  2. #12
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

  3. #13
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,057
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Теория правильная, но на практике, если этой программой 3 разделить на 3 получится 0.
    3*85/256 = 0.99609...
    Если округлить до ближайшего целого - то получится правильный ответ, 1.

    Например, если у нас в HL - результат от умножения на 85, то:
    Код:
    LD A,H
    RL L
    ADC A,0
    Округлит результат.

    ---------- Post added at 16:07 ---------- Previous post was at 15:59 ----------

    Только что проверил. Округление - это хорошо, но в деле нахождения остатка помогает плохо. Неверное частное без округления при умножении на 85 и делении на 256 получается только для тех чисел, которые делятся на 3 нацело. Но этот случай легко предусмотреть. Например, находим частное q = i*85/256 (округляем в меньшую сторону). Умножаем частное на 3, вычитаем из делимого. Получаем остаток, который будет равен 3 (а не 0) в случае, если исходное число делится на 3 нацело. Просто проверяем, что если вычисленный остаток равен 3 - то обнуляем его, и все.

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •