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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2015, 13:53   #21
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, конечно.

Этот блок, который из массива P, в котором находятся двоичные цифры (исходное число P)
получает новый массив (имя его pPlus1) с двоичными цифрами, являющимися двоичным представлением числа P+1 (исходное число плюс единица)

Теперь рассмотрим, как это осуществляется

Код:
  perenos := 1; {это та исходная единица, которую нужно прибавить к числу P}

  for i:=n downto 0 do  {выполняем сложение в столбик
                               если Вы хоть раз складывали два числа в столбик,
                         то знаете, что сложение осуществляется СПРАВА налево,
                          от младших разрядов к старшим.
                         Поэтому тут цикл от n к самой старшей цифре числа }
  begin

    pPlus1[i]:=p[i]+perenos; {очередная цифра равна сумме соответствующей цифры исходного числа и плюс перенос с предыдущего разряда}

    perenos := pPlus1[i] div 2; {новый перенос получаем, если получили число БОЛЬШЕ 2}

    pPlus1[i] := pPlus1[i] mod 2; {если число больше двух, то отбрасываем всё, 
                            что больше двух (оно уже ушло в перенос) 
                            и оставляем ОСТАТОК от деления числа на 2
                           если число меньше двух, то оно не изменится:
                                остаток от деления 0 на 2 равен 0
                                остаток от деления 1 на 2 равен 1
                            }
end; {конец цикла}

дальше ещё проще.
Это вывод двоичного числа БЕЗ ведущих нулей.
ну, если Вы введёте число 0000101, то P+1 будет 0000110
а этим кодом мы найдём ПЕРВЫЙ не ноль в числе:

Код:
  start := 0; {начинаем от старшего разряда}
  while (pPlus1[start]=0)   до тех пор, пока цифра под индексом Strat равна нулю
              and (Start<n)  и пока не дошли до крайнего правого (младшего) разряда
             do Inc(Start);  увеличиваем индекс Start
Вы можете закомментировать(убрать строчки с while (pPlus1[start]=0) and (Start<n) do Inc(Start);
- это ничего не испортит в работе программы. Просто в начале числа могут выводится нолики.
и всё.

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

Огромнейшее спасибо!! Всё ОЧЕНЬ понятно теперь!!
)
Asya7 вне форума Ответить с цитированием
Старый 20.01.2015, 19:53   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
Огромнейшее спасибо!! Всё ОЧЕНЬ понятно теперь!!
)
Большое пожалуйста.
Успехов!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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