User Tag List

Страница 77 из 109 ПерваяПервая ... 737475767778798081 ... ПоследняяПоследняя
Показано с 761 по 770 из 1128

Тема: ЭТЮДЫ

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    16.02.2011
    Адрес
    г. Новочеркасск
    Сообщений
    129
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    13
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    2 раза "add a" затем просто умножаете на b и берете старший байт.
    Ну так это тоже самое получается что и у меня. - "2 раза add a" - это два моих вращения. "просто умножаете на b" - это умножение 8бит на 8бит = 16 бит
    Так у меня и сейчас работает. То же самое по скорости.

    Я хочу умножение оптимизировать в 6 ротаций, вместо 8 влево и потом 2 вправо. как blackmirror предложил, Просто надо просчитать и попробовать, может сходу замена DUP 8 DUP 6 прокатит

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    надо что-то такое мутить:

    if b=64 then exit ;a=a*64/64

    a*b/64 = ( (a+b)^2 - a^2 - b^2 ) / 2 / 64 = (a+b)^2 / 64 - a^2 / 64 - b^2 /64 + rra

    need table x^2/64 (x=0..126) или возможно x^2/32 + rra:srl a

    ...или можь вообще так:
    ;(a+b)^2 - (a-b)^2 = a^2 + b^2 + 2*a*b - a^2 - b^2 + 2*a*b = 4*a*b

    a*b/64 = ( (a+b)^2 - (a-b)^2 ) / 4 / 64 = ( (a+b)^2 / 128 - (a-b)^2 / 128 ) + rra

    (используется предрасчитанная табличка x^2 / 128 )

    ...или вообще
    a*b/64 = ( (a+b)^2 - (a-b)^2 ) посчитали в HL (двумя взятиями из таблицы) и старший байт забрали в A (это и есть / 4 / 64)
    (используется предрасчитанная табличка x^2)

    Код:
    ;
    ;mul_ac4:
    ;hl = (a+c)^2 - (a-c)^2 = a*c*4
    	ld	h,sqr_tbl/256
    	sub	c
    	ld	l,a
    	add	a,c
    	add	a,c
    	ld	c,(hl)
    	inc	h
    	ld	b,(hl)
    	ld	l,a
    	ld	a,(hl)
    	dec	h
    	ld	l,(hl)
    	ld	h,a
    	sbc	hl,bc
    ;/mul_ac4
    
    	ld	a,h	;a = a*c*4/256 = a*c/64
    ...и как вариант возможной дальнейшей оптимизации, из таблицы не по 2 байта брать (16битное вычитание), а вначале по младшим байтам решение вынести - повлияют ли они на старшие (перенос), и уж потом из таблицы брать и вычитать старшие, с учетом переноса или его отсутствия

    Код:
    ;a = a*c/64 = ( (a+c)^2 - (a-c)^2 ) / 256
    	ld	h,sqr_tbl/256
    	sub	c
    	ld	l,a
    	ld	b,(hl)
    	add	a,c
    	add	a,c
    	ld	c,l
    	ld	l,a
    	ld	a,(hl)
    	sub	b
    	inc	h
    	ld	a,(hl)
    	ld	l,c
    	sbc	a,(hl)
    [при заполнении 512b sqr_tbl таблицы квадратов не забыть квадраты для отрицательных чисел]


    - - - Добавлено - - -

    получить N*4/3. Есть мысли?
    взять стандартную процедуру побитного деления и раскрыть-расписать, учитывая, что делитель в данном конкретном случае - это просто два включенных бита / две ветки переходов, с невключенными остальными / пустыми ветками
    3 = %00000011
    Последний раз редактировалось char; 10.10.2018 в 23:13.

  4. #3

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,451
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    взять стандартную процедуру побитного деления и раскрыть-расписать, учитывая, что делитель в данном конкретном случае - это просто два включенных бита / две ветки переходов, с невключенными остальными / пустыми ветками
    3 = %00000011
    Да все уже, сделано. Вычисления длинные, к тому же это демо, решается lut размером 512 байт.

  5. #4

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,451
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Проверка на присутствие числа в диапазоне:
    Код:
    between: ; B.C=high/low, A=value
    	ld e,a
    	ld a,b
    	cp e
    	ret c
    	ld a,e
    	cp c
    	ret
    Есть другие варианты?

  6. #5

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Проверка на присутствие числа в диапазоне:
    А типа такого не прокатит?
    Код:
    ; In: B.C=high/low, A=value
    ; Out: флаг C=1 если число не в диапазоне
    between:
            cp b
            ccf
            ret c
            cp c
            ret
    Последний раз редактировалось Destr; 21.11.2018 в 17:48.

  7. #6

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,451
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Найдено в интернетах:
    При устройстве на работу программистом столкнулся с интересной задачей следующего содержания:

    «Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово Fizz, а вместо чисел, кратных пяти — слово Buzz. Если число кратно пятнадцати, то программа должна выводить слово FizzBuzz. Задача может показаться очевидной, но нужно получить наиболее простое и красивое решение.»
    пишите решения.

  8. #7

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово Fizz, а вместо чисел, кратных пяти — слово Buzz. Если число кратно пятнадцати, то программа должна выводить слово FizzBuzz.Задача может показаться очевидной, но нужно получить наиболее простое и красивое решение
    Задача действительно очевидная, а требование "простоты и красоты" переводит её в рубрику "угадай, что нравится автору". Быть может, требуется соблюдать определенные стандарты в оформлении кода?

    Можно ли придумать что-либо проще и очевиднее, чем вариант от shurik-ua выше? Сомневаюсь. А именно понятность кода для коллег является одним из главных качеств программиста, которые хотят видеть работодатели.

    По эффективности где-то можно оптимизировать. Скорость или, там, место в памяти. И это будет сильно зависеть от целевой архитектуры.

    Скажем, если процессор не имеет аппаратного деления или, если деление медленное - то имеет право на жизнь такой вариант:
    Код:
    #include <stdio.h>
    void main(void)
    {
        int r3=1;
        int r5=1;
        for(int i=1; i<=100; i++)
        {
            if(r3==3)
            {
                r3=0;
                printf("Fizz");
            }
            if(r5==5)
            {
                r5=0;
                printf("Buzz");
            }
            if(r3 || r5)
            {
                printf("%d",i);
            }
            putchar('\n');
            r3++;
            r5++;
        }
    }
    Но даже и здесь насчет эффективности можно поспорить, т.к. вывод на консоль почти на всех архитектурах (даже Z80) существенно медленнее, чем деление.

  9. #8

    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    365
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    var
      s0: string;
    begin
      for i:=1 to 100 do begin
        s0:='';
        if (i mod 3) = 0 then s0:= 'Fizz';
        if (i mod 5) = 0 then s0:= s0 + 'Buzz';
        if s0 ='' then s0:= inttostr(i);
        writeln(s0);
      end;

  10. #9

    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,086
    Спасибо Благодарностей отдано 
    102
    Спасибо Благодарностей получено 
    151
    Поблагодарили
    99 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    .org $8000
    ld b,0
    ld c,0
    ld d,1
    l1:
    ld e,0
    inc b
    ld a,b
    cp 3
    jr nz,j1
    ld b,0
    ld hl,str_fizz
    call print_strhl
    inc e
    j1:
    inc c
    ld a,c
    cp 5
    jr nz,j2
    ld c,0
    ld hl,str_buzz
    call print_strhl
    inc e
    j2:
    ld a,e
    and a
    jr nz,j3
    call print_strnum
    j3:
    ld a,32
    rst 16;lf
    inc d
    ld a,d
    cp 101
    jr nz,l1
    ret
    
    str_fizz: .db 'fizz',0
    str_buzz: .db 'buzz',0
    
    print_strhl:
    push bc
    push de
    l2:
    ld a,(hl)
    and a
    jr z,q1
    rst 16
    inc hl
    jr l2
    q1:
    pop de
    pop bc
    ret
    
    print_strnum:
    push bc
    push de
    ld c,d
    ld b,0
    call 6683
    pop de
    pop bc
    ret

  11. #10

    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    365
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    сурово )

Страница 77 из 109 ПерваяПервая ... 737475767778798081 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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