Dzielenie binarne

0

czy robil ktos w ddelphi dzielenie binarne? jakas funkcja by mi sie przydla bo nie mam czasu tego napisac :( (sesja...). np 1000000000001 : 101101 itd...
wczesniej dodale topic ale go nie widze

0

Metoda sierpa i młota (tudzież łopaty): Binarny -> Decymalny (Dzielna), Binarny -> Decymalny (Dzielnik), Podziel, Decymalny -> Binarny (Wynik) :)

0

no tak ale ja potrzebuje zeby reszte mi pokazywalo i etapy dzielenia :) bo to ma byc do kodowania

0

czgos nie czaisz... System dziesiętny w komputerze jest tylko i wyłacznie dla wygody człowieka. WSZYTSTKIE operacje maematyczne są wykonywane binarnie. wiec jesli wpiszesz 15/3 to procesor nie wykona dzielenia dziesietnego, tylko wykona binarne 1111/11. A sam algorytm? chyba najprostszy do wykonania jest za pomoca przesuniec. Powiedzmy masz juz to 15 (1111) i 3 (11)...

przesuwasz w lewo dzielnik dopoki bedzie mniejszy badz równy dzielnej...
11 shl 0 = 11 <= 1111
11 shl 1 = 110 <= 1111
11 shl 2 = 1100 <= 1111 <- tego szukamy
11 shl 3 = 11000 > 1111 <- to juz jest za duzo

czyli przesunales 11 o 2 w lewo. przesuniecie o 2 w lewo jest rownoznaczne z wymnozeniem przez 4 (2 do takiej potegi, ile razy przesunales w lewo - 2^2 = 4 ).

Teraz odejmujesz od 1111 otrzymana liczbe czyli 1100. Otrzymujesz w wyniku 0011 (bede pisal 0011, zeby nie mylic z dzielnikiem 3- 11), ktory to wynik staje sie dzielna, podstawa dalszych dzialan . 4 zapamietujesz

Sprawdzasz, czy wynik nie jest mniejszy od dzielnika (0011 >= 11 - jest rowny)

Teraz szukasz znow tego samego czyli maksymalnego przesuniecia nie wiekszego od dzielnej...

znow probujesz swoja trojke (11) przesunac tyle razy ile trzeba...

11 shl 0 <= 0011 <- bingo :>

2 do potegi 0 to 1 (2^0=1) ... jedynke dodajesz do zapamietanej czworki 4+1=5

odejmujesz:

0011 - 11 = 0 :)

sprawdzasz wynik odejmowania... 0 < dzielnik czyli konec petli brak danych do dalszego dzielenia...

Co nam pozostalo ? 4+1=5 jak w morde zgadza sie 15/3=5 ;]

// masz modul vlong w dziale download. Tam chyba wlasnie taka implementacja dzielenia jest. popatrz, pomysl przerob na wlasne potrzeby.

albo ci to jeszcze napisze ale tylko dla dodatnich (nie chce mi sie kombinowac ze znakami):

function podziel(dzielna,dzielnik:integer):integer;
var 
  wynik:integer;
  i,j:integer;
begin
  if(dzielnik=0)then exit; // nie dziel cholero nigdy przez zero
  wynik:=0;
  while dzielna>=dzielnik do // było zle dzielna>0
    begin
      j:=dzielnik;
      i:=0;
      while j shl 1<=dzielna do // niezbyt to optymalne
        begin
          j:=j  shl 1;
          i:=i+1;
        end;
      dzielna:=dzielna-j;
      wynik:=wynik+(1 shl i); // 1 shl i = 2^i
    end;
  podziel:=wynik;
end;

// <font color="blue">DOPISANE</span>
Myk jest taki, że zapomnialem o reszcie z dzielenia...
Warunek na wyjscie z petli jest taki... reszta < dzielnik

0

Ale czy ten algorytm można zastosować także do obliczenia części ułamkowej dzielenia ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1