какой самый быстрый код, получающий остаток от деления 64-битного числа в edx:eax на 4294967296 (2^32) а то что-то в голову ничего не приходит интересного
BaGiE Не заморачивайся, а просто юзай eax там, где хотел дальше и все. По сути то, что ты ты написал, это значит отбросить все что, выше бита 2^32,т.е не принимать в дальнейшем edx !
Чето непойму. Какого фигу тогда компилятор (Delphi5) чтобы поделить вставил целую длиннющую процедуру для деления.
BaGiE А это "приколы нашего городка" Я встречался уже с подобным -- и в Дельфи, и в Студии. Почему такое происходит -- без понятия, а разбираться лень.
Для работы с int64 у делфи вообще отдельный набор функций для основных операций. Компилятор просто вставляет их в нужное место, причём даже не инлайнит никогда и оптимизации там соответственно никакой. По-крайней мере так было в Delphi6-7.
Да эта хрень мне нужна была для построения линейного конгруэнтного ПСП - можно заюзать в примитивнейном шифровании для генерации гаммы (Хотя там же написано что метод не обладает криптографической стойкостью, зато быстр, удобен и энтропия у шифртекста нормальная - даже нисколько не упаковывается). В данном случае генерируется последовательность с максимальным периодом 2^32. Еще вопрос. По ссылке написано - "Numerical Recipes in C рекомендует следующие значения: a = 1664525, c = 1013904223, m = 2^32". Какие числа выбрать, чтобы получить максимальный период, но с 64-битными числами (понятно, что m = 2^64).
Код (Text): format PE GUI 4.0 include 'win32a.inc' invoke GetTickCount call _next ;... call _next invoke wsprintf,__result,__fmt,eax invoke MessageBox,0,__result,__null,0 invoke ExitProcess,0 _next: mov edx,1664525 mul edx add eax,1013904223 retn __fmt db 'The random number is 0x%08X' __null db 0 __result db $-__fmt+3 dup (?) data import library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' import kernel32,\ GetTickCount,'GetTickCount',\ ExitProcess,'ExitProcess' import user32,\ wsprintf,'wsprintfA',\ MessageBox,'MessageBoxA' end data
Спасибо) А еще слышал про какой-то ПСП. Называется как то типа Xorshift - 128 или фиг знает. Нагуглил сорцы, но нифига не понял как работает и в том числе сорцы не работали. Может кто поможет?