Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 20:24

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 10:13 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
DUP 1 LSHIFT  AAAAAAAA AND SWAP 55555555 AND OR
 DUP 2 LSHIFT  CCCCCCCC AND SWAP 33333333 AND OR
DUP 4 LSHIFT  F0F0F0F0 AND SWAP 0F0F0F0F AND OR
 DUP 8 LSHIFT  FF00FF00 AND SWAP 00FF00FF AND OR
 DUP 10 LSHIFT  FFFF0000 AND SWAP 0000FFFF AND OR

работать не будет, так как сдвиги нужно в обе стороны делать!

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 12:51 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
я спрашивал о том, есть ли в используемом вами форте команда LSHIFT

Ответ - да. Поправил код:
Код:
: 2POWER ( n - 2^n )   1 SWAP LSHIFT ;

или
Код:
ICODE 2POWER
   #1 # EAX MOV  EBX ECX MOV  EAX CL SHL  EAX EBX MOV
   RET
END-CODE

продолжаем
Код:
( ПОЗИЦИЯ СТАРШЕГО ЗНАЧАЩЕГО БИТА )
ICODE ?MSB ( # -- n )
   #32 # ECX MOV  1 L: EBX EBX ADD  2 L# JC
   1 # ECX SUB  1 L# JNZ  2 L: ECX EBX MOV
   RET
END-CODE

( ПОЛУЧАЕМ НОМЕРА БИТОВ РАВНЫХ ЕДИНИЦЫ )
: PREPARE ( # -- n1 .. nk k)
   DEPTH >R BEGIN  DUP ?MSB  ?DUP NOT IF  R>DROP EXIT  THEN
               TUCK 1- 2POWER -  ?DUP 0= UNTIL   DEPTH R> - 1+ ;

( ПОЛУЧАЕМ ЗЕРКАЛЬНОЕ ПОБИТОВОЕ ОТРАЖЕНИЕ ЧИСЛА )
: REVERSE ( # -- # )
   PREPARE  0 TUCK ?DO  SWAP #32 SWAP- 2POWER +  LOOP ;

( ОПЕРАЦИЯ ДЛЯ МАССИВА ЧИСЕЛ )
: REVADDR ( addr # -  )
   0 ?DO  DUP @  REVERSE OVER !  CELL+  LOOP  DROP ;

тестируем код
Код:
: .SHOW ( addr # - )
  0 ?DO  DUP I CELLS + @  U.  LOOP DROP ;

HEX CREATE TESTARRAY  AA , AAAA , AAAAAAAA ,

TESTARRAY 3 REVADDR

TESTARRAY 3 .SHOW


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 13:17 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Функцию REVERSE оптимизируем руками:
Код:
ICODE REVERSE
   #32 # ECX MOV
   1 # EAX MOV
1 L: EBX SHR
   EAX EAX ADC
   1 # ECX SUB
   1 L# JNZ
   EAX EBX MOV
   RET
END-CODE

: REVADDR ( addr # -  )
   0 ?DO  DUP @  REVERSE OVER !  CELL+  LOOP  DROP ;


Решение упростилось.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 14:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Alexander писал(а):
Функцию REVERSE оптимизируем руками:

спасибо Александр, решение интересное, но, к сожалению проверить его я не могу, так как форт, используемый вами комерческий 8( И еще, ассемблерное решение не очень интересно, потому как интересно решение на чистом форте 8), хотя ассемблерное тоже подходит.
(Да, имя результирующего слова было задано, и оно не REVADDR а revarr.)

P.S. очень понравилось слово R>DROP - это не опечатка?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 14:40 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mOleg писал(а):
WingLion писал(а):DUP 1 LSHIFT  AAAAAAAA AND SWAP 55555555 AND OR
 DUP 2 LSHIFT  CCCCCCCC AND SWAP 33333333 AND OR
DUP 4 LSHIFT  F0F0F0F0 AND SWAP 0F0F0F0F AND OR
 DUP 8 LSHIFT  FF00FF00 AND SWAP 00FF00FF AND OR
 DUP 10 LSHIFT  FFFF0000 AND SWAP 0000FFFF AND OR
работать не будет, так как сдвиги нужно в обе стороны делать!


все получается, только хитрее:
Код:
REQUIRE FOR   devel\~mOleg\lib\util\for-next.f
REQUIRE ROL   shift.f

\ произвести реверс бит указанного числа
: revcell ( u --> u )
          DUP 0xFF00FF00 AND SWAP 0x00FF00FF AND 0x10 ROL OR
          DUP 0xF0F0F0F0 AND SWAP 0x0F0F0F0F AND 0x08 ROL OR
          DUP 0xCCCCCCCC AND SWAP 0x33333333 AND 0x04 ROL OR
          DUP 0xAAAAAAAA AND SWAP 0x55555555 AND 0x02 ROL OR
          0x01 ROL ;

\ для массива addr # произвести битовый реверс
: revarr ( addr # --> )
         FOR DUP @ revcell OVER !
             CELL +
         TILL DROP ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 16:03 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
слово R>DROP - это не опечатка

нет не опечатка. просто выталкивает верхушку стека возврата в неиспользуемый регистр.
mOleg писал(а):
И еще, ассемблерное решение не очень интересно, потому как интересно решение на чистом форте

Ладно придумаем как задейтвовать флаг переноса. Доки ссылаются на использование слов U<, U>


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 22:21 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
не самое скоростное лобовое решение:
самое скоростное как и с последовательностью битов будет "массив решений", где индекс указывет на свой собственный реверс, при этом, конечно, 32 бита - многовато, но побайтно (256 байт) легко. если очень нужно быстро, то 16-битные полу-числа - это один сегмент досовский, немного

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 23:16 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
вопрос писал(а):
самое скоростное как и с последовательностью битов будет "массив решений", где индекс указывет на свой собственный реверс, при этом, конечно, 32 бита - многовато, но побайтно (256 байт) легко. если очень нужно быстро, то 16-битные полу-числа - это один сегмент досовский, немного

аха гдето я это даже видел

_________________
SPF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 23:17 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
работать не будет, так как сдвиги нужно в обе стороны делать!


С нормальными циклическими сдвигами должно работать

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 14, 2007 23:28 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
формально же N LSHIFT делает то же самое, что и 32 N - RSHIFT, если сдвиги циклические

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 15, 2007 14:42 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Вот очередное определение отражения 32-разрядной ячейки.
Все только в стандартных словах Форта.
Код:
: REVERSE ( # - # )
   0  32 0 DO  SWAP 0 D2*  I LSHIFT ROT +  LOOP  NIP ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 16, 2007 10:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
самое скоростное как и с последовательностью битов будет "массив решений", где индекс указывет на свой собственный реверс, при этом, конечно, 32 бита - многовато, но побайтно (256 байт) легко. если очень нужно быстро, то 16-битные полу-числа - это один сегмент досовский, немного

ну, 16-битные числа это крутовато, а вот для байтового массива решение
Код:
REQUIRE FOR            devel\~mOleg\lib\util\for-next.f
REQUIRE B@             devel\~mOleg\lib\util\bytes.f

\ произвести реверс бит указанного байта
: revbyte ( b --> b )
          0 8 FOR 2* OVER 1 AND OR
                  SWAP 2/ SWAP
              TILL NIP ;

\ массив с инвертированными байтами
CREATE brarr  256 FOR 256 R@ - revbyte B, TILL

\ произвести реверс ячейки
: revcell ( u --> u )
          0 4 FOR 8 LSHIFT
                  OVER 0xFF AND brarr + B@ OR
                  SWAP 8 RSHIFT SWAP
              TILL NIP ;

\ для массива addr # произвести битовый реверс
: revarr ( addr # --> ) FOR DUP @ revcell OVER ! CELL + TILL DROP ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 16, 2007 20:26 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Alexander писал(а):
Вот очередное определение отражения 32-разрядной ячейки.
Все только в стандартных словах Форта.

Код:: REVERSE ( # - # )   0  32 0 DO  SWAP 0 D2*  I LSHIFT ROT +  LOOP  NIP ;


вот адаптация для СПФа вашего алгоритма:
Код:

REQUIRE FOR   devel\~mOleg\lib\util\for-next.f

\ произвести реверс бит указанного числа
: revcell ( u - u ) 0  32 0 DO  SWAP 0 D2*  I LSHIFT ROT +  LOOP  NIP ;

\ для массива addr # произвести битовый реверс
: revarr ( addr # --> )
         FOR DUP @ revcell OVER !
             CELL +
         TILL DROP ;


_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 16, 2007 23:11 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
сравниваем скорость решений.
проц P4M 512RAM 2GHz   Compaq evo n610c 
Calls Ticks AverageTicks

mrack1 100 | 595,835,848 | 5,958,358
mrack 100 | 606,864,448 | 6,068,644
mOleg 100 | 1,500,738,032 | 15,007,380
winglion 100 | 168,612,552 | 1,686,125
winglion1 100 | 94,206,068 | 942,060
winglion2 100 | 146,995,208 | 1,469,952
mOlega 100 | 380,644,224 | 3,806,442
Alexander 100 | 1,260,778,612 | 12,607,786


итог быстродействия mrack:
intel Celeron M 1,5 ГГц ОЗУ 240МБ 
Calls Ticks AverageTicks

mrack 100 | 310,687,011 | 3,106,870
mrack1 100 | 194,321,586 | 1,943,215
alexf 100 | 863,461,611 | 8,634,616
mOleg 100 | 730,044,537 | 7,300,445
mOlegb 100 | 157,327,697 | 1,573,276
wingl1 100 | 66,184,951 | 661,849

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Последний раз редактировалось mOleg Пт ноя 16, 2007 23:39, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 16, 2007 23:13 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
да, все примеры лежат здесь: http://www.forth.org.ru/~mOleg/samples/2007-11-11/

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB