Согласие на обработку персональных данных.

15.12.2018
Новая задача Как преобразовать байт в килобайт.

05.12.2018
Новые видео и статья Параграфы и выравнивание текста в HTML.

01.12.2018
Новый выпуск журнала Автоматизация и программирование.

26.11.2018
Новые видео и статья Функция Concat.

25.11.2018
Новые видео и статья Справка в Lazarus.



Раздел: Задачи / Простейшие /

Двоичное число в виде строки

Условие задачи 0.1

Задача 0.1
Преобразовать десятичное число в двоичное и вывести на экран в виде строки, не используя для преобразования стандартные функции. То есть создать собственный аналог функции BinStr в FreePascal.

Я уже рассказывал о том, как преобразовать число в двоичную строку. Там мы применили стандартную функцию BinStr. Эта функция довольно удобна, и при создании программ на FreePascal/Lazarus её стоит использовать.

Однако для учебных программ это было бы слишком просто. К тому же при обучении может быть задана именно такая задача, как приведённая выше - то есть преобразование числа в строку с его двоичным представлением без использования каких-либо стандартных функций.

Кроме того, далеко не во всех языках программирования есть функции, подобные BinStr. Поэтому знать способы решения такой задачи весьма полезно.

Решить эту задачу можно, как всегда, несколькими способами. Но я покажу только один. Алгоритм решения этим способом следующий:

  1. В цикле проверять биты числа справа налево (хотя можно и наоборот).
  2. Если текущий бит числа равен 1, то присоединить строку к символу ‘1’, иначе присоединить строку к символу ‘0’.

ВАЖНО!
Обратите внимание на то, что я написал во втором шаге: именно присоединять строку к символу, а не символ к строке. Разъяснения будут ниже.

Алгоритм, как видите, простой. Однако новички могут не справиться со вторым шагом, потому что, скорее всего, не знают, как проверить отдельный бит числа, да ещё без использования каких-нибудь приятных в работе функций.

Тех, кто получал в школе двойки по информатике и не знает, что такое бит, отправляю сюда для того, чтобы вспомнить суть двоичной системы счисления.

Для остальных расскажу, как определить значение отдельного бита в числе.

Здесь тоже может быть несколько способов. Но я использую следующий:

  1. Взять число А, все биты которого равны нулю, кроме того бита, который мы хотим проверить в заданном числе В.
  2. Выполнить операцию И между числами А и В, затем сравнить результат с нулём.
  3. Если результат равен 0, то и поверяемый бит равен нулю. Иначе бит равен 1.

Углубляться в объяснения не буду. Если хотите разобраться - изучайте информатику вообще и двоичную систему в частности, а также булеву алгебру и ассемблер. Если разобраться не хотите - то просто поверьте на слово, что это работает, и смотрите примеры программ на Паскале и С++, где этот способ используется.

Решение задачи 0.1 на Паскале
program mybinstrfunc;

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************

var
  Num : DWORD;
  Str : ShortString;

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Преобразует десятичное число в строку с двоичным представлением числа
// ВХОД:  Val - число, Num - количество символов в строке
// ВЫХОД: строка с двоичным представлением числа Val, или
//        пустая строка, если в параметре Num указано значение более 32
//        этим  функция отличается от стандартной BinStr
//****************************************************************
function MyBinStr(Val : DWORD; Cnt : byte) : ShortString;
var i, n  : DWORD;
    sval  : ShortString;
begin
  Result := '';
  if Cnt > 32 then  //Если указано слишком большое число символов,
    Exit;           //то выйти из функции
  i := 1;
  n := 0;
  sval := '';
  while n < Cnt do  //Перебираем разряды в цикле,
    begin           //начиная с младшего (справа налево)
      Inc(n);
      if (Val and i) = i then //Если в разряде 1
        sval := '1' + sval
      else                    //Если в разряде 0
        sval := '0' + sval;
      i := i * 2;   //Перейти к следующему разряду
    end;
  Result := sval;
end;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************

begin
  //Проверяем работу функции MyBinStr
  for Num := 0 to 15 do
    begin
      Str := MyBinStr(Num, 4);
      WriteLn(Num, '(DEC) = ', Str, '(BIN)');
    end;

  //Сравниваем со стандартной функцией BinStr
  Num := 987654321;
  Str := MyBinStr(Num, 33);
  if Str = '' then
    WriteLn('ERROR: Too large a value of the second parameter!')
  else
    WriteLn(Num, '(DEC) = ', Str, '(BIN)');
  //Функция BinStr не проверяет значение параметра Cnt, поэтому
  //выведет столько знаков, сколько указано,
  //заполнив лишние старшие разряды нулями
  WriteLn(Num, '(DEC) = ', BinStr(Num, 34), '(BIN)');

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.

Решение задачи 0.1 на С++
#include <cstdlib>
#include <iostream>

using namespace std;

unsigned long int Num;
string Str; 

//****************************************************************
// Преобразует десятичное число в строку с двоичным представлением числа
// ВХОД:  Val - число, Num - количество символов в строке
// ВЫХОД: строка с двоичным представлением числа Val, или
//        пустая строка, если в параметре Num указано значение более 32
//        этим  функция отличается от стандартной BinStr
//****************************************************************
string MyBinStr(unsigned long int Val, char Cnt)
{
  unsigned long int i = 1, n = 0;
  string sval = "";

  if (Cnt > 32)        //Если указано слишком большое число символов, 
     return(sval);     //то выйти из функции
  while (n < Cnt)
  {
    n++;
    if ((Val & i) == i)
      sval = '1' + sval;
    else
      sval = '0' + sval;
    i = i * 2;
  }
  return(sval);
}       

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  for (Num = 0; Num < 16; Num++)
  {
    Str = MyBinStr(Num, 4); 
    cout << Num << "(DEC) = " << Str << "(BIN)" << endl;
  }

   Num = 987654321;
   Str = MyBinStr(Num, 32);
   if (Str == "") 
     cout << "ERROR: Too large a value of the second parameter!" << endl;
   else
     cout << Num << "(DEC) = " << Str << "(BIN)" << endl; 
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика