Как и в десятичной системе, в двоичной системе счисления для отделения дробной части используется точка (двоичная точка). Каждая позиция слева от этой точки также имеет свой вес – вес разряда дробной части числа. Значение веса в этом случае равно основанию системы счисления (т.е. двойке), возведенному в отрицательную степень.
Получить десятичное число из двоичного чрезвычайно просто. Согласно формуле
для двоичной системы счисления получаем:
Пример иллюстрирует процесс получения десятичного числа из двоичного.
Перевод двоичного числа в десятичное
4.2 Преобразование десятичных чисел в двоичные
Перевод из двоичной системы в десятичную несколько сложнее. Рассмотрим несколько алгоритмов.
4.2.1 Метод деления
Другим методом является так называемый метод деления. Он применяется для преобразования целых чисел. Ниже приведен его алгоритм.
Разделим нацело десятичное число на двойку. Если есть остаток, запишем в младший разряд единицу, а если нет – нуль и снова разделим результат от первого деления. Повторим процедуру так до тех пор, пока окончательный результат не обнулиться.
Пример 4.3 Перевод десятичного числа в двоичное методом деления
2 | ||||||||
148 | –74 | 2 | ||||||
1 | 74 | –37 | 2 | |||||
0 | 36 | –18 | 2 | |||||
1 | 18 | –9 | 2 | |||||
0 | 8 | –4 | 2 | |||||
1 | 4 | –2 | 2 | |||||
0 | 2 | –1 | 2 | |||||
0 | 0 | 0 | ||||||
1 | ¬ | старший разряд | ||||||
(10010101)2=(149)10 | ¬ ответ |
4.2.2 Метод умножения
И, наконец, метод умножения. Метод применяется для преобразования десятичных дробей (чисел меньших единицы).
Число умножается на 2, если результат ³ 1, то в старший разряд записывается единица, если нет, то нуль. Умножаем на 2 дробную часть результата и повторяем процедуру. И так далее до получения нужной степени точности или до обнуления результата.
Перевод десятичного числа в двоичное методом умножения
5.Постановка задачи.
Наиболее часто встречающиеся системы счисления это двоичная, десятеричная и шестнадцатеричная система счисления, восьмеричная система счисления встречается только в инженерных калькуляторах, практическое же применения её давно прекратилось. Итак, наша задача осуществить перевод целых чисел из одной системы счисления в другую. Для этого выберем двоичную, восьмеричную, десятеричную и шестнадцатеричную систему счисления.
6.Внешнее проектирование программы.
Для наглядности программу перевода лучше изобразить в виде ориентированного графа. Но если перевод осуществлять по этой схеме, то
код программы будет громоздким. Так как будет множество алгоритмов перевода.
Чтобы упростить программу я решил переводить с двоичной, восьмеричной, десятеричной и шестнадцатеричной системы счисления в десятеричную систему. Из десятеричной системы перевод осуществляется в любую из предложенных.
7.Математическая модель.
Для перевода из 2, 8, 10, 16 систем счисления в десятичную систему использую формулу:
n
AiMi,i=0
где Ai – значение разрядного коэффициента i-го разряда, а М это основание системы счисления.
Пример:
Число 326 в десятичной системе можно записать так 3*102+2*101+6*100=326
Число 100110 в двоичной системе можно записать так 1*25+0*24+0*23+1*22+1*21+0*20=38.
Для перевода из десятичной системы счисления в 2, 8, 10, 16 используем алгоритм:
repeat
c := a mod e;
if (e = 16) and (c>9) then l:= l + chr(c+55) else l:= l + chr(c+48);
if a <> 0 then b := a div e;
if b<e then if (e = 16) and (b>9) then l:= l + chr(b+55) else l:= l + chr(b+48);
a := b;
until (b<e) or (a = 0).
В результате разработки программы я столкнулся с проблемой возведения целого числа в степень. Для этого мне пришлось разработать алгоритм возведения целого числа в степень.
var
i,y: integer;
begin
y:=1;
fori:= 1 tondo{Цикл задает число умножений}
y := y*x;{умножает число которое требуется возвести в цикл на Yи присваивает значение Y}
step := y;
end;
8.Кодирование и отладка программы.
Для кодирования программы используем среду программирования BorlandDelphi 7 Enterpriseedition. Для начала я сделал форму, в которой имеется строка для ввода информации две группы радио кнопок и кнопка «перевести».
Для работы выбраны библиотеки(uses)
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
Типыданных:
type
TForm1 = class(TForm)
Edit1: TEdit;
RadioGroup1: TRadioGroup;
Label1: TLabel;
Button1: TButton;
RadioGroup2: TRadioGroup;
Label2: TLabel;
Label3: TLabel;
StatusBar1: TStatusBar;
procedure Edit1Change(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RadioGroup2Click(Sender: TObject);
private
{ Private declarations }
public
{ Publicdeclarations }
end;
В разделе описания идентификаторов внесены следующие пункты:
Form1: TForm1; {форма окна}
vv1 : string; {переменная типа (целое число)stringдля ввода информации в строку «переводимое число»}
m,m1,ch1, i : integer;{переменные строкового типа(string) m, m1 используется для радиогрупп «Исходная система» и «Конечная система», ch1 вспомогательная переменная для перевода чисел, Iпеременная для циклов,}
implementation
{$R *.DFM}
В программе использованы следующие функции и процедуры.
1)Функция переводит данные из типа charв тип integer. Входные данные это переменная «a» типа char, выходные данные типа integer. Принцип работы программы заключается в том, что переменная «а» переводиться в ASCIIкод, и отнимается определённое число(55,48,87), вследствие чего получается число в десятичном виде. 55 - отнимается если символ «а» в диапазоне [‘A’..‘F’], 87 – если диапазон [‘a’..‘f’] и 48 – если диапазон [‘0’..‘9’].
function perevod0(a:char):integer;
var
c: integer;
begin
case a of
'A'..'F': c := ord(a) - 55;
'a'..'f': c := ord(a) - 87;
'0'..'9': c := ord(a) - 48;
end;
perevod0 := c;
end;
2) Функция переводит из десятичной системы в систему Е. «A» - переменная типа integer, служит для ввода десятичного числа. Переменная «е» типа integerслужит для ввода системы счисления в которую нужно перевести число в моей программе e := m1(т.е. то что выбирается в радиогруппе «Конечная система »)
function perevod1(a:integer;e: integer): string;
var
l,j : string;
z,c,b,d: integer;
begin
repeat{Начало цикла}
c := amode;{с это остаток от деления десятичного числа на систему счисления }
if (e = 16) and (c>9) thenl:= l + chr(c+55) elsel:= l + chr(c+48);{Если система счисления шестнадцатеричная и остаток от деления больше 9, то число становиться от Aдо F, иначе число записывается от 0 до 9}
ifa <> 0 thenb := adive;{Если а неравно нулю то bприсваивается целочисленное деление а на е}
if b<e then if (e = 16) and (b>9) then l:= l + chr(b+55) else l:= l + chr(b+48);
{Если B меньше системы счисления, то если система счисления шестнадцатеричная и остаток от деления больше 9, то число становиться от Aдо F, иначе число записывается от 0 до 9}
a := b; {aприсваивается b}
until (b<e) or (a = 0);{Цикл выполняется пока bменьше системы счисления (е) или десятичное число «а» станет равно 0}
fori:= length(l) downto 1 do{Цикл который идет назад т.е 3,2,1}
if (l[i]='0') and (z = 0) thenelsebeginj:=j+ l[i]; z:=1 end;{Условный оператор переворачивает строку задом наперед}
perevod1 := j;
end;
3) Функция проверяет, введены ли числа в диапазоне [‘0’..‘9’, ‘A’..‘F’, ‘a’..‘f’], и включены ли радиогруппы. Vv1 – строка ввода типа string.
Вывод типа integerесли ошибка равно 1 иначе 0.
function error1(vv1:string):integer;
begin
fori := 1 tolength(vv1) do {цикл от одного до конца строки ввода вспомогательная переменная i}
ifvv1 = '' thenerror1 :=1{Если строка ввода пустая то error1 присваивается 1}
else{иначе, если vv1[i]='0'..'9','a'..'f','A'..'F' не какого действия не происходит, иначе error1 присваивается 1}
begin
case vv1[i] of
'0'..'9','a'..'f','A'..'F':;
else error1 :=1;
end;
end;
end;
4) Функция возводит целое число в степень. x– это число в которое требуется возвести в степень, N– степень в которую надо возвести число вывод информации в типе integer.
function step(n:integer; x : integer): integer;
var
y: integer;
begin
y:=1;
fori:= 1 tondo{Цикл задает число умножений}
y := y*x;{умножает число которое требуется возвести в цикл на Yи присваивает значение Y}
step := y;
end;
5) Присваивает переменной vv1 входные данные.