давно
Старший Модератор
31795
6196
16.02.2009, 16:03
общий
это ответ
Здравствуйте, Челпанников Алексей Алексеевич!
Программа работающая в 16-ой СС(ввод-вывод), в приложении(под pascalABC).
По функциям:
HexToBin рекурсивная функция преобразовывающая число в 16-ой системе в двоичную запись.
inputHex подпрограмма вводит число в 16-ой системе и возвращающая число в двоичной, запись двоичного числа производится в обратном порядке, с помощью этого достигается выравнивание чисел, т.е. разряды с одинаковым весом имеют одинаковые позиции в строке.
outputHex рекурсивная процедура выводит число в 16-ой системе. При рекурсии каждый раз обрабатывается одна 16-я цифра.
doSummaBin процедура суммирования двух двоичных чисел.
rangeBin процедура выравнивает введенные числа на размер определенный в разделе констант.
convertBin процедура перевода двоичного числа в дополнительный код.
Рабочие числа в программе - двоичные, а ввод и вывод производится в 16-ой системе(сокращенная запись двоичных чисел), практически как и в самом процессоре.
Удачи!
Приложение:
uses crt;
const
n=32;
type
TMass=string[n];
var a,b,c:TMass;
function HexToBin(d,e:integer):string;
begin
{корректируем под 16-е число}
{ dec(d,7*ord(d>9));}
if d>9 then dec(d,7);
HexToBin:='';
{рекурсивно формируем 16-е число ввиде строки}
if e>0 then HexToBin:=chr(ord('0') + d mod 2) + HexToBin(d div 2,e-1);
end;
procedure inputHex(var d:TMass;e:char);
begin{inputHex}
{вводим число в обратном порядке}
write('Enter number',e:2,':');
d:='';
repeat
e:=ReadKey;{символ без эхо}
case e of
'0'..'9','A'..'F','a'..'f':
begin
{ e:=chr(ord(e) - 32*ord(e>'Z'));{приводим число к единому регистру}
if e>'Z'then e:=chr(ord(e) - 32);
write(e);{выводим его}
d:=HexToBin(ord(e)-ord('0'),4)+d;{формируем двоичную строку}
end;
end;{case}
until (e=chr(13))or(length(d)=n);{}
writeln;
end;{inputHex}
procedure outputHex(d:TMass);
var
i,j:integer;
e:TMass;
begin{outputHex}
if length(d)>0 then
begin{if}
e:=copy(d,1,4);{получаем четыре бита}
{ delete(d,1,4);{удаляем их их числа}
outputHex(copy(d,5,length(d)-4));{рекурсивно вызываем себя}
i:=0;
j:=length(e);
while j>0 do{преобразовываем строку в число}
begin{while}
i:=i*2 + ord(e[j]) - ord('0');
dec(j);
end;{while}
if i>9 then inc(i,7);{*ord(i>9));{корректируем его с учетом 16-ой системы}
e:=chr(ord('0')+i);{формируем символ и выводим его}
write(e);
end;{if}
end;{outputHex}
procedure doSummaBin(var d,e:Tmass);
var
f:char;
i:integer;
begin{doSummaBin}
f:='0';{флаг переноса для старшего разряда}
for i:=1 to length(d) do
begin{for}
if (e[i]<>d[i])then
{обрабатываем ситуацию когда биты различны}
begin{ed=10,01}
if f='1'
then d[i]:='0' {edf=101,011}
else d[i]:='1';{edf=100,010}
end{10,01}
else
{обрабатываем ситуацию когда биты одинаковы}
begin{ed=00,11}
{edf=001,000,111,110}
d[i]:=f;
f:=e[i];
end;{00,11}
end;{for}
end;{doSummaBin}
procedure rangeBin(var d:Tmass);
begin{rangeBin}
while length(d)<n do
d:=d+'0';{}
end;{rangeBin}
procedure convertBin(var d:TMass;e:TMass);
var
i:integer;
begin{convertBin}
for i:=1 to length(d)do
{инвертируем биты}
case d[i]of{case}
'0':d[i]:='1';
'1':d[i]:='0';
end;{case}
rangeBin(e);{выравниваем строку}
doSummaBin(d,e);{суммируем}
end;{convertBin}
begin{main}
{вводим числа}
inputHex(a,'A');
inputHex(b,'B');
{выравниваем к одному размеру}
rangeBin(a);
rangeBin(b);
{переводим в дополнительный код}
convertBin(b,'1');
{суммируем А + Вд}
doSummaBin(a,b);
{выводим результат}
outputHex(a);
ReadKey;
end.{main}
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.