Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

ROR&ROL   Найти похожие ветки 

 
Uzver32.dll   (2005-06-15 15:33) [0]

Здравствуйте, мастера!
У меня к вам такой вопрос:
В ассемблере существуют команды сдвига ROR и ROL,
Есть ли в Delphi их аналоги?
Shl и Shr не подходят, например:
10000001b shl 1 = 00000010b, а надо 00000011b
Написать так тоже не выходит:


var sdvig:byte;
   input:dword;
...  
asm
rol input,sdvig//Пишет "Operand size mismatch"
end;

С уважением, Евгений.


 
TUser ©   (2005-06-15 15:38) [1]

В смысле нужен циклический сдвиг?
function Ror(I: integer; Count: smallint): integer;
begin
 result:=(I shr Count) or (I shl ((sizeof(integer) shr 3)-Count))
end;

function Rol(I: integer; Count: smallint): integer;
begin
 result:=(I shl Count) or (I shr ((sizeof(integer) shr 3)-Count))
end;


 
TUser ©   (2005-06-15 15:39) [2]

Count: byte;


 
Alx2 ©   (2005-06-15 15:43) [3]

Uzver32.dll   (15.06.05 15:33)

function ROL(Value : DWORD; cnt : Byte):DWORD; register;
asm
movzx ecx,cnt
rol eax,cl
end;


 
Uzver32.dll   (2005-06-15 15:46) [4]

Спасибо за ответ!
Вот у меня ещё один вопрос назрел:
как подсчитать кол-во единиц в двоичном числе:

function get_n(ipt:dword):byte;
begin
if ipt=0 then begin
 result:=0;
 exit;
end;
 result:=1;
while ((ipt div 2)<>0) do begin
 if ((ipt mod 2)=1) then Inc(Result);
 ipt:=ipt div 2;
end;
end;

кажется слишком громоздким...


 
TUser ©   (2005-06-15 15:52) [5]

function Count (D: dword): byte;
begin
 result:=0;
 if D < 0 then D:=-D;
 while D > 0 do begin
   if D mod 2 = 1 then
     inc (result);
   D:=D shr 1;
   end;  
end;


 
Uzver32.dll   (2005-06-15 15:56) [6]

а возможно ли ещё короче?
этот код должен работать очень быстро


 
Jeer ©   (2005-06-15 15:56) [7]

function CountOne_(Value:int64): byte;
begin
 Result := 0;
 while (Value<>0) do begin
   Value := (Value-1) and Value;
   Inc(Result);
 end;
end;


 
Digitman ©   (2005-06-15 16:06) [8]

function Count(Value: Cardinal): Byte;
asm
 mov edx, eax
 sub eax, eax
 mov ecx, sizeof(Cardinal) * 8
@@loop:
 shr edx, 1
 adc eax, 0
 dec ecx
 jne @@loop  
end;


 
Uzver32.dll   (2005-06-15 16:11) [9]

Ёще раз спасибо за ответы! До свидания!


 
Jeer ©   (2005-06-15 16:15) [10]

hex = F4240

Jeer = 65 ns
TUser = 80 ns
Digitman = 1175 ns


 
Alx2 ©   (2005-06-15 16:19) [11]

Jeer ©   (15.06.05 16:15) [10]

Ура! Затравка дана :)


 
Alx2 ©   (2005-06-15 16:23) [12]

Подозреваю, будет самый тормозной вариант:

 Function BitCount(Value: Cardinal): Cardinal;
 Const
   Tbl: Array[0..255] Of Cardinal = (
     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
     4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8);
 Var
   Data: Packed Array[0..3] Of byte Absolute Value;
 Begin
   Result := Tbl[Data[0]] + Tbl[Data[1]] + Tbl[Data[2]] + Tbl[Data[3]];
 End;


 
Jeer ©   (2005-06-15 16:33) [13]

Ну вот, я такой вариант тщательно скрывал:))
Мало ли кто и для чего:)

hex = F4240

Alx2 = 10 ns
Jeer = 65 ns
TUser = 80 ns
Digitman = 1175 ns

Комментарий:
Alx2, Digitman - почти не зависит от кол-ва 1
Jeer, TUser - примерно линейно.


 
A man   (2005-06-15 16:49) [14]

Может оффтоп, но как вообще измеряют скорость алгоритмов?


 
Jeer ©   (2005-06-15 17:05) [15]

Алгоритмов - никак.
А их реализаций через опрос таймеров/счетчиков.


 
Alx2 ©   (2005-06-15 17:05) [16]

еще быстрее:

 Function MaskBitCount(Value: Cardinal): Cardinal;
 Begin
   result := (Value and $55555555) + ((Value shr 1)   and $55555555);
   result := (Result and $33333333) + ((Result shr 2) and $33333333);
   result := (Result and $0F0F0F0F) + ((Result shr 4) and $0F0F0F0F);
   result := (Result and $00FF00FF) + ((Result shr 8) and $00FF00FF);
   result := (Result and $0000FFFF) + ((Result shr 16) and $0000FFFF);
 End;


PS
Этот алгоритм как-то MBo приводил.


 
Bless ©   (2005-06-15 17:17) [17]

>Alx2 ©  (15.06.05 17:05) [16]
>еще быстрее

Сомневаюсь, что быстрее.


 
Jeer ©   (2005-06-15 17:26) [18]

Alx2 = 10 ns
Mbo = 14 ns
Jeer = 65 ns
TUser = 80 ns
Digitman = 1175 ns

Погрешность за счет циклического измерения 1-2 ns



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
14-1118729210
Rouse_
2005-06-14 10:06
2005.07.11
Репортажик о отдыхе в Костроме


14-1117694033
stone
2005-06-02 10:33
2005.07.11
Скоро и пешеходы будут передвигаться по правилам одностороннего д


6-1112774053
atruhin
2005-04-06 11:54
2005.07.11
Как обратиться к конкретному DNS серверу для разрешения имени


14-1118160113
ArMellon
2005-06-07 20:01
2005.07.11
Песни Led Zeppelin


1-1118261613
SniZ
2005-06-09 00:13
2005.07.11
Сжатие строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский