Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 09.08.2010, 13:26   #1
Tronix
Знающий
 
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений
(для 331 пользователей)
Деление 8bit на 8bit

Привет, в математике полный лох, поэтому спрошу здесь -
нужен алгоритм целочисленного деления одной восьмибитной переменной на другую восьмибитную, используя только SHR/SHL и вычитание/сложение.
Чтото типа такого:
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: Для любителей деления в столбик и им сочувствующих в танках - использовать операцию деления и умножения НЕЛЬЗЯ.

Последний раз редактировалось Tronix, 09.08.2010 в 15:02.
(Offline)
 
Ответить с цитированием
Старый 12.08.2010, 14:29   #2
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: Деление 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.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Tronix (12.08.2010)
Старый 12.08.2010, 18:00   #3
Tronix
Знающий
 
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений
(для 331 пользователей)
Ответ: Деление 8bit на 8bit

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

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
Но похоже что твое решение намного быстрее. Щаз скоро проверим. Спасибо.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com