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

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

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

Условие задачи 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;
}

Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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