Главная страница
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.51 MB
Время: 0.048 c
9-1111847882
Sirian
2005-03-26 17:38
2005.07.11
Игра флип флоп


9-1111856084
$SerG$
2005-03-26 19:54
2005.07.11
Maya есть у кого?


10-1095063443
Weare
2004-09-13 12:17
2005.07.11
Как корректно открыть Excel, взять оттуда значение ячейки и ...


3-1117522893
galexis
2005-05-31 11:01
2005.07.11
Ошибка "Разрушительный сбой"


1-1118325920
Erik1
2005-06-09 18:05
2005.07.11
Непойму в чем ошибка при выделении памяти с помощю SetLength?