eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Szybkie szukanie ustawionego bitu
Ilość wypowiedzi w tym wątku: 27

  • 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


strony : 1 . 2 . [ 3 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: