Текущий архив: 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.085 c