Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2015, 15:17   #11
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Спасибо! Но извините, а умножать, то на 3 как? Там лишь сложение и вычитание.
Asya7 вне форума Ответить с цитированием
Старый 18.01.2015, 15:46   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот еще вариант на основании строк. Ток для турбо макс длина строки 255, для фри нет такой проблемы
Код:
function BinAdd(Value1,Value2: String): String;
var i,j,i1,i2: Integer;
    s: String;
begin
  i1:=Length(Value1);
  i2:=Length(Value2);
  s:=''; i:=0;
  while (i1>0) or (i2>0) do begin
    if (i1>0) and (i2>0) then begin j:=StrToInt(Value1[i1])+StrToInt(Value2[i2]); Dec(i1); Dec(i2); end
    else if i1>0         then begin j:=StrToInt(Value1[i1]);                      Dec(i1);          end
                         else begin j:=StrToInt(Value2[i2]);                      Dec(i2);          end;
    Inc(j,i);
    s:=IntToStr(j mod 2)+s;
    i:=j div 2;
  end;
  if i=1 then s:='1'+s;
  BinAdd:=s;
end;

function BinMul(Value1,Value2: String): String;
var i: Integer;
    s: String;
begin
  s:='0';
  for i:=Length(Value2) downto 1 do begin
    if Value2[i]='1' then s:=BinAdd(s,Value1);
    Value1:=Value1+'0';
  end;
  BinMul:=s;
end;

....

  s1:='100110101101';
  s2:='10011010110101';
  s:=BinMul(s1,s2);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.01.2015 в 15:49.
Аватар вне форума Ответить с цитированием
Старый 18.01.2015, 16:00   #13
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Аватар, спасибо! Правда очень кажется уж сложно пока для моего уровня знаний программирования.
Asya7 вне форума Ответить с цитированием
Старый 18.01.2015, 16:02   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Пожалуйста. Не сложней, чем Сергей на массивах предлагал. Но на массивах все эффективней обычно

PS

Я тут умножение двоичных дал, тема то про сложение или умножение?
В принципе для сложения достаточно функции BinAdd. Для вычитания сделай свою если надо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.01.2015 в 16:12.
Аватар вне форума Ответить с цитированием
Старый 18.01.2015, 17:17   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар
В принципе для сложения достаточно функции BinAdd
категорически согласен!

Asya7, для того, чтобы получить 3p достаточно просто три раза сложить число p
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2015, 17:25   #16
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Всем спасибо за пояснения!
Asya7 вне форума Ответить с цитированием
Старый 18.01.2015, 17:28   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в качестве извращения, можно каждый разряд двоичного числа умножить на 3, а потом скорректировать полученное НЕ ДВОИЧНОЕ число:

к моему примеру с массивами:
Код:
const MaxNumberBit = 100;
var 
   p, pPlus1, pMinus1, pMulti3 : array[0..MaxNumberBit] of byte;
....

  {умножить на 3 для получения числа 3p}
  pMulti3[0] := 0; {ещё один раздряд резервируем для переполнения}
  for i:=0 to n do pMulti3[i+1] := p[i] * 3; {каждый разряд числа p умножаем на 3}
  {теперь надо скорректировать, превратить полученное безобразие в нормальное
                 двоичное число}
  perenos := 0;
  for i:=n+1 downto 0 do
  begin
    pMulti3[i]:= pMulti3[i]+perenos;
    perenos := pMulti3[i] div 2;
    pMulti3[i] := pMulti3[i] mod 2;
  end;

  {вывод результата}
  start := 0;
  while (pMulti3[start]=0) and (Start<(n+1)) do Inc(Start);

  WriteLn;
  Write('двоичное число 3*p: ');
  for i:=start to n+1 do Write(pMulti3[i]);
  WriteLn;


end.
Внимание! Будьте осторожны. Это метод не сработает, если место 3-х умножать на большее число (даже уже на 4-ре нельзя просто так заменить 3-ку!!!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.01.2015, 19:41   #18
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

А вы могли бы пожалуйста, построчно пояснить что здесь делаем, а то всё понятно, кроме этого.
Код:
perenos := 1;
  for i:=n downto 0 do
  begin
    pPlus1[i]:=p[i]+perenos;
    perenos := pPlus1[i] div 2;
    pPlus1[i] := pPlus1[i] mod 2;
  end;
  
  start := 0;
  while (pPlus1[start]=0) and (Start<n) do Inc(Start);
  
  WriteLn;
  Write('двоичное число p+1: ');
  for i:=start to n do Write(pPlus1[i]);
  WriteLn;
  
  {получение числа P-1}
  zaem := 1;
  for i:=n downto 0 do
  begin
    if p[i]>=zaem then begin
       pMinus1[i] := p[i]-zaem;
       zaem := 0
    end
    else begin
       pMinus1[i] := p[i]+2-zaem;
       zaem := 1
Asya7 вне форума Ответить с цитированием
Старый 19.01.2015, 21:07   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Asya7, тут много строчек. Какая из них Вам непонятна?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.01.2015, 12:18   #20
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Пожалуй, вот эти, самые не понятные. Можете объяснить?
Код:
for i:=n downto 0 do
    pPlus1[i]:=p[i]+perenos;
    perenos := pPlus1[i] div 2;
    pPlus1[i] := pPlus1[i] mod 2;
  start := 0;
  while (pPlus1[start]=0) and (Start<n) do Inc(Start);
Asya7 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод чисел между десятичной и фибоначчиваемой системой счисления genofond Паскаль, Turbo Pascal, PascalABC.NET 14 15.12.2012 21:43
модуль с двоичной системой счисления MishanyaZWER Паскаль, Turbo Pascal, PascalABC.NET 4 19.04.2010 18:49
Сложение, вычитание в двоичной системе счисления Vemor Паскаль, Turbo Pascal, PascalABC.NET 5 16.06.2009 14:02
Сложение в двоичной системе счисления Volchara Общие вопросы C/C++ 2 23.04.2009 19:54
Деление чисел в двоичной системе счисления Mss_Smith Помощь студентам 9 04.05.2007 17:02