forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Деление 8bit на 8bit (http://forum.boolean.name/showthread.php?t=13104)

Tronix 09.08.2010 13:26

Деление 8bit на 8bit
 
Привет, в математике полный лох, поэтому спрошу здесь -
нужен алгоритм целочисленного деления одной восьмибитной переменной на другую восьмибитную, используя только SHR/SHL и вычитание/сложение.
Чтото типа такого:
PHP код:

Var
      
a,b,b1,q,byte;
begin
      a 
:= 100;
      
:= 15;
      
b1 := b;
      while 
b1 <= do 
            
begin
                  b1 
:= b1 shl 1;
            
end;
      {
b1 ab1 * (некоторая степень 2)}
      
q:=0
      
r:=a;
      {
инвариантqчастное и остаток при делении a на b1,
      
b1 * (некоторая степень 2)}
      while 
b1 <> do
            
begin
                  b1 
:= b1 shr 1 := q shl 1;
                  { 
b1 r<= rb1}
                  if 
>= b1 then 
                        begin
                              r 
:= b1;
                              
:= 1;
                        
end;
            
end;
      
write(q,'   ',r);
      
readln;
end

Но как видно, тут получаем переполнение при операции shl если делимое больше 127 и, соответственно, уход в зацикливание. Нужно как-то извратится, и не получать переполнение. Чтобы можно было поделить скажем 250 на 230 и тд.

PS: Для любителей деления в столбик и им сочувствующих в танках - использовать операцию деления и умножения НЕЛЬЗЯ.

abcdef 12.08.2010 14:29

Ответ: Деление 8bit на 8bit
 
MIDletPascal:
Код:

var
  sum,ost,a,b : integer;
begin
  a:=250;
  b:=230;
  /// a div b ///
  sum:=0;
  ost:=a;
  while (ost>=b) do
  begin
    ost:=ost-b;
    sum:=sum+1;
  end;
  drawText(''+a+' div '+b+' = '+sum+'; '+ost, 0, 0);
  repaint;       
  repeat until false;
end.


Tronix 12.08.2010 18:00

Ответ: Деление 8bit на 8bit
 
Спасибо за решение, пока я выкручивался так:

PHP код:

Var
 
q,x,y,a,b,counter byte;

Begin
      x 
:= 20;      
      
:= 4;       
      
:= 0;       
      while 
>= do
            
Begin
                  a 
:= x shr 1;
                  
:= y;
                  
counter := 1;
                  while 
>= do
                        
begin
                              b 
:= b shl 1;
                              
counter := counter shl 1;
                        
end;
                  
:= b;
                  
:= counter;
            
End;
      
Debug(0,0,q);        {Print result X DIV Y}
end

Но похоже что твое решение намного быстрее. Щаз скоро проверим. Спасибо.


Часовой пояс GMT +4, время: 09:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot