-
21. Data: 2015-09-01 17:28:39
Temat: Re: Szybkie szukanie ustawionego bitu
Od: szemrany <s...@o...off>
On Tue, 01 Sep 2015 16:10:46 +0200, bartekltg wrote:
>> Piszę w Delphi ;-)
>
> Toto jeszcze żyje? ;-)
I ma się całkiem dobrze, poza ceną :/
> delphi prawdopodobnie też, ale trzeba poszukać w ichniejszej
> dokumentacji... której na szybko nie wygoglalem;-)
Nie spotkałem się i na 90% nie ma, ale sobie jeszcze zobacze jak to we FPC
zrobili.
> Z tego co pamietam procedury w asm pisało się tam bardzo przyjemnie,
> więc jak nie znajdziesz, zrób jak Radosław radzi i napisz samemu.
> bsf/bsr dzialają tak samo na 32 bitach, trzeba tylko pamitać,
> w czym przychodzi zmienna i gdzie umieścić wynik.
1,5h przed Twoim postem pisałem, że to już zrobiłem, w asmie też ;-)
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
22. Data: 2015-09-01 22:20:03
Temat: Re: Szybkie szukanie ustawionego bitu
Od: szemrany <s...@o...off>
On Tue, 1 Sep 2015 14:40:34 +0200, szemrany wrote:
> Czas: 813 ms
> Czas: 67 ms
> Czas: 51 ms
> Czas: 28 ms
Specjalnie dla AK źrodła funkcji:
function SzukajBita_1(u64 : UInt64) : Integer;
var
I: Integer;
u32: UInt32;
begin
I := 0;
while u64 and 1 <> 1 do
begin
u64 := u64 shr 1;
Inc(i);
end;
Result := I;
end;
function SzukajBita_2(u64 : UInt64) : Integer;
var
I: Integer;
begin
I := 0;
if (u64 and $00000000FFFFFFFF) = 0 then
begin
I := I + 32;
u64 := u64 shr 32;
end;
if (u64 and $000000000000FFFF) = 0 then
begin
I := I + 16;
u64 := u64 shr 16;
end;
if (u64 and $00000000000000FF) = 0 then
begin
I := I + 8;
u64 := u64 shr 8;
end;
if (u64 and $000000000000000F) = 0 then
begin
I := I + 4;
u64 := u64 shr 4;
end;
if (u64 and $0000000000000003) = 0 then
begin
I := I + 2;
u64 := u64 shr 2;
end;
if (u64 and $0000000000000001) = 0 then
begin
I := I + 1;
end;
Result := I;
end;
function SzukajBita_3(u64 : UInt64) : Integer;
var
I: Integer;
u32: UInt32;
begin
I := 0;
u64 := u64 and -u64;
u32 := u64 and $ffffffff;
if u32 = 0 then
begin
u32 := u64 shr 32;
I := 32;
end;
case u32 of
2: Inc(I, 1);
4: Inc(I, 2);
8: Inc(I, 3);
16: Inc(I, 4);
32: Inc(I, 5);
64: Inc(I, 6);
128: Inc(I, 7);
256: Inc(I, 8);
512: Inc(I, 9);
1024: Inc(I, 10);
2048: Inc(I, 11);
4096: Inc(I, 12);
8192: Inc(I, 13);
16384: Inc(I, 14);
32768: Inc(I, 15);
65536: Inc(I, 16);
131072: Inc(I, 17);
262144: Inc(I, 18);
524288: Inc(I, 19);
1048576: Inc(I, 20);
2097152: Inc(I, 21);
4194304: Inc(I, 22);
8388608: Inc(I, 23);
16777216: Inc(I, 24);
33554432: Inc(I, 25);
67108864: Inc(I, 26);
134217728: Inc(I, 27);
268435456: Inc(I, 28);
536870912: Inc(I, 29);
1073741824: Inc(I, 30);
2147483648: Inc(I, 31);
4294967296: Inc(I, 32);
end;
Result := I;
end;
function SzukajBita_4(u64 : UInt64) : Integer;
begin
asm
MOV EAX, -1
BSF EAX, DWORD PTR [&u64]
JNZ @@Exit
BSF EAX, DWORD PTR [&u64 + 4]
JZ @@Exit
ADD EAX, 32
@@Exit:
MOV &Result, EAX
end;
end;
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
23. Data: 2015-09-04 09:14:33
Temat: Re: Szybkie szukanie ustawionego bitu
Od: Wojciech Muła <w...@g...com>
On Tuesday, September 1, 2015 at 10:20:06 PM UTC+2, szemrany wrote:
> function SzukajBita_4(u64 : UInt64) : Integer;
> begin
> asm
> MOV EAX, -1
> BSF EAX, DWORD PTR [&u64]
> JNZ @@Exit
> BSF EAX, DWORD PTR [&u64 + 4]
> JZ @@Exit
> ADD EAX, 32
> @@Exit:
> MOV &Result, EAX
> end;
> end;
To jest niepoprawne, jeśli argumentem BSF jest zero, to wynik
jest "undefined". Działa przez przypadek. :)
w.
-
24. Data: 2015-09-04 09:53:49
Temat: Re: Szybkie szukanie ustawionego bitu
Od: szemrany <s...@o...off>
On Fri, 4 Sep 2015 00:14:33 -0700 (PDT), Wojciech Muła wrote:
>> MOV EAX, -1
>> BSF EAX, DWORD PTR [&u64]
>
> To jest niepoprawne, jeśli argumentem BSF jest zero, to wynik
> jest "undefined". Działa przez przypadek. :)
Wynik BSF jest niezdefiniowany, a w EAX pozostaje wartość sprzed operacji
BSF, czyli tutaj -1 :-)
Ale to i tak szczegół, bo gdy wartość jest zero to nie szukam w niej bitów,
w innych algorytmach też są takie założenia i przy wartości zero nie
działają ;-)
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
25. Data: 2015-09-04 17:01:47
Temat: Re: Szybkie szukanie ustawionego bitu
Od: Wojciech Muła <w...@g...com>
On Friday, September 4, 2015 at 9:53:55 AM UTC+2, szemrany wrote:
> On Fri, 4 Sep 2015 00:14:33 -0700 (PDT), Wojciech Muła wrote:
>
> >> MOV EAX, -1
> >> BSF EAX, DWORD PTR [&u64]
> >
> > To jest niepoprawne, jeśli argumentem BSF jest zero, to wynik
> > jest "undefined". Działa przez przypadek. :)
>
> Wynik BSF jest niezdefiniowany, a w EAX pozostaje wartość sprzed operacji
> BSF, czyli tutaj -1 :-)
Tutaj EAX jest wynikiem, a dokumentacja mówi: "DEST is undefined". To,
że wartość nie jest zmieniana, to zachowanie niezdefiniowane. Na innych
modelach CPU może być inaczej.
> Ale to i tak szczegół, bo gdy wartość jest zero to nie szukam w niej bitów,
> w innych algorytmach też są takie założenia i przy wartości zero nie
> działają ;-)
Szukasz pierwszym BSF.
w.
-
26. Data: 2015-09-04 20:20:53
Temat: Re: Szybkie szukanie ustawionego bitu
Od: szemrany <s...@o...off>
On Fri, 4 Sep 2015 08:01:47 -0700 (PDT), Wojciech Muła wrote:
>>>> MOV EAX, -1
>>>> BSF EAX, DWORD PTR [&u64]
>>>
>>> To jest niepoprawne, jeśli argumentem BSF jest zero, to wynik
>>> jest "undefined". Działa przez przypadek. :)
>>
>> Wynik BSF jest niezdefiniowany, a w EAX pozostaje wartość sprzed operacji
>> BSF, czyli tutaj -1 :-)
>
> Tutaj EAX jest wynikiem, a dokumentacja mówi: "DEST is undefined". To,
> że wartość nie jest zmieniana, to zachowanie niezdefiniowane. Na innych
> modelach CPU może być inaczej.
Zaproponuj zatem coś sensownego, chętnie się czegoś nauczę.
>> Ale to i tak szczegół, bo gdy wartość jest zero to nie szukam w niej bitów,
>> w innych algorytmach też są takie założenia i przy wartości zero nie
>> działają ;-)
>
> Szukasz pierwszym BSF.
Miałem na myśli, że nie wywołuję tej metody, bo nie ma sensu, gdy bitów
brak.
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
27. Data: 2015-09-07 09:46:50
Temat: Re: Szybkie szukanie ustawionego bitu
Od: "Radoslaw Szwed" <r...@p...fm>
Użytkownik "szemrany" <s...@o...off> napisał w wiadomości
news:1llz3cs5ynt8v$.1khbc54i4d219.dlg@40tude.net...
> On Fri, 4 Sep 2015 08:01:47 -0700 (PDT), Wojciech Muła wrote:
>>> Wynik BSF jest niezdefiniowany, a w EAX pozostaje wartość sprzed operacji
>>> BSF, czyli tutaj -1 :-)
>>
>> Tutaj EAX jest wynikiem, a dokumentacja mówi: "DEST is undefined". To,
>> że wartość nie jest zmieniana, to zachowanie niezdefiniowane. Na innych
>> modelach CPU może być inaczej.
>
> Zaproponuj zatem coś sensownego, chętnie się czegoś nauczę.
Na upartego można tak, ale sprawdzałem poprzednią wersję na i3,i5,i7 i AMD FX
i zawsze było tak samo w EAX było -1.
or dword ptr [&u64], 0
jnz check
or dword ptr [&u64 + 4], 0
jnz check
xor eax, eax
dec eax
jmp @@EXIT
@@check
BSF EAX, DWORD PTR [&u64]
JNZ @@Exit
BSF EAX, DWORD PTR [&u64 + 4]
JZ @@Exit
ADD EAX, 32
@@Exit:
MOV &Result, EAX