Переведення цілих чисел із 10-ї системи числення в 2-у і навпаки.

Лабораторна робота 6

ДІленНя ДВІЙКОВИХ ЧИСЕЛ без вІДНОВЛЕННЯ І з вІДНОВЛЕННЯМ ЗАЛИШКУ

 

Мета роботи

У результаті виконання лабораторної роботи навчитись виконувати операції ділення з використанням двійкових кодів за схемами ділення без відновлення і з відновленням залишку.

 

Теми для попереднього пророблення

6.2.1. Лінійні зсуви.

6.2.2. Переведення цілих чисел із 10-ї системи числення в 2-у і навпаки.

6.2.3. Отримання двійкових прямого (ПК) і додаткового (ДК) кодів.

6.2.4. Правила додавання двійкових цифр в i-му розряді двійкового числа з урахуванням можливого переносу із попереднього молодшого розряду.

Завдання до лабораторної роботи

Таблиця 6.1 – Вихідні дані для виконання лабораторної роботи № ва­рі­ан­та Вихідні числа для виконання операції ділення … Продовження таблиці 6.1 № ва­рі­ан­та Вихідні числа для…  

Хід отримання результатів

1) Вирівняти кількість розрядів у двійковому зображенні діленого A і дільника B ( для цього треба дописати незначущі нулі зліва в двійковому числі з… 2) Отримати додаткові коди для чисел: +A2, –A2, +B2 і –B2. 3) Цілій частині частки C присвоїти початкове значення, яке дорівнює 0.

Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності до п.6.4

6.5.1. Спочатку треба вручну для двох пар чисел отримати результати для свого індивідуального завдання, як це зроблено в прикладах у п.6.4.1 і п.6.4.2.

6.5.2. Перевірити правильність отриманих в п.6.5.1 результатів за допомогою демонстраційної програми, текст якої розміщений нижче.

6.5.3. Демонстраційну програму треба запустити на виконання в одному з середовищ, яке підтримує програмування на мові Pascal.

6.5.4. Текст демонстраційної програми.

Ділення без відновлення залишку

program delen_bez_vost_ost;

uses crt;

const n:byte=4;{точность вычислений}

var A,B,_B,T,k:integer;{A,B - содержат прямой код}

{_B - это '-В' в дополнительном коде}

i,j:byte;

C,p,r:real; {результат}

z_a,z_b:boolean; {знак чисел А и В}

p_b,p_a,m:byte;

a_h,b_h,c_h:shortint;

a_l,b_l,c_l:word;

d :char;

procedure shr_ab(var a:shortint;var b:word);

begin {линейный сдвиг вправо двоичной записи}

for i:=1 to 15 do {shr b}

if (((1 shl i) and b)<>0) and (((1 shl (i-1)) and b)=0)

then b:=b+(1 shl (i-1)) else

if (((1 shl i) and b)=0) and (((1 shl (i-1)) and b)<>0)

then b:=b-(1 shl (i-1));

if ((1 shl 15) and b)<>0 then b:=b-(1 shl 15);

if odd(a) then b:=b+trunc(exp(15*ln(2)));

for i:=1 to 6 do {sar a}

if (((1 shl i) and a)<>0) and (((1 shl (i-1)) and a)=0)

then a:=a+(1 shl (i-1)) else

if (((1 shl i) and a)=0) and (((1 shl (i-1)) and a)<>0)

then a:=a-(1 shl (i-1));

if ((1 shl 6) and a)<>0 then a:=a-(1 shl 6);

end;

procedure Write_ab(a:shortint;b:word);

begin {вывод на экран двоичной записи}

for i:=7 downto 0 do

{ write(ord(((1 shl i) and a)<>0):2);

write('.');}

for i:=15 downto 0 do

write(ord(((1 shl i) and b)<>0):2);

Writeln(' ');

end;

procedure add(var a:integer;_b:integer); {сложение}

var t:integer;

p:word;

i:byte;

begin

p:=0;

T:=0;

for i:= 0 to 15 do {slogenie}

case ord(((1 shl i) and A)<>0)+ord(((1 shl i) and _B)<>0)+

ord(((1 shl i) and p)<>0) of

1:T:=T or trunc(exp(i*ln(2)));

2:p:=p or trunc(exp((i+1)*ln(2)));

3:begin

T:=T or trunc(exp(i*ln(2)));

p:=p or trunc(exp((i+1)*ln(2)));

end;

end;

A:=T;

end;

begin

while true do

begin

clrscr;

textcolor(13);

writeln('Ограничения:');

writeln('# Эта программа работает только с целыми числами, вводите их без знака');

writeln('# После ввода каждого исходного числа нажимайте Enter');

writeln('# Вывод результата на экран - в 2-байтовом поле, слева направо:');

writeln(' - не допускайте переполнения разрядной сетки!');

writeln(' - для знака результата бит не зарезервирован!');

writeln(' - в старших битах - переведенная в двоичный код целая часть результата!');

writeln(' - в остальных битах - дробная часть результата!');

writeln;

textcolor(15);

writeln(' DELENIE BEZ VOSSTANOVLENIA OSTATKA');

writeln;

Write('A= ');

Readln(T);

write('bin:', ' ':3);

for k:=15 downto 0 do

write(ord(((1 shl k) and t) <>0):2);

writeln(' ');

if T<0 then z_a:=true; {знак}

T:=abs(T);

for i:=15 downto 0 do {представление в прямом коде}

if ord((1 shl i) and T)<>0 then A:=A + trunc(exp(i*ln(2)));

Write(#10#13,'B= ');

Readln(T);

write('bin:', ' ':3);

for k:=15 downto 0 do

write(ord(((1 shl k) and t) <>0):2);

writeln(' ');

if T<0 then z_b:=true; {знак}

T:=abs(T);

for i:=15 downto 0 do {представление в прямом коде}

if ord((1 shl i) and T)<>0 then B:=B + trunc(exp(i*ln(2)));

_B:=B;

if B>0 then _B:=_B + trunc(exp(15*ln(2))); {знак _B}

for i:=14 downto 0 do {инвертировать _B}

if ((1 shl i)and _B)=0 then

_B:=_B + (1 shl i) else _B:=_B - (1 shl i) ;

{перевод в дополнительный код}

inc(_B);

{вычисление целой части результата}

While A>=0 do begin

Add(A,_B);

if A>=0 then c:=c+1;

end;

{деление без восстановления остатка}

for i:=1 to N do begin

for j:=14 downto 0 do {shl A}

if (((1 shl j) and A)<>0) and (((1 shl (j+1)) and A)=0)

then A:=A+(1 shl (j+1)) else

if (((1 shl j) and A)=0) and (((1 shl (j+1)) and A)<>0)

then A:=A-(1 shl (j+1));

if odd(A) then dec(A);

if A > 0 then ADD(A,_B) else ADD(A,B);

if A > 0 then C:=C + exp((-i)*ln(2)); {Ci=1}

end;

if z_a xor z_b then c:=-c; {знак результата}

Writeln(#10#13,'C= ',c:N+3:N);

r:=C;

a_h:=abs(trunc(r));

if r<0 then a_h:=a_h + trunc(exp(7*ln(2)));

r:=frac(r);

i:=15;

while (r<>0) and (i<>0) do

begin

r:=r*2;

if trunc(r) <>0 then a_l:=a_l + trunc(exp(i*ln(2)));

dec(i);

r:=frac(r);

end;

for i:=6 downto 0 do {нахождение порядка числа a}

if ord((1 shl i) and a_h)<>0 then begin p_a:=i+1; break; end;

{перевод в формат с плавающей точкой}

m:=p_a;

while m<>0 do begin shr_ab(a_h,a_l); dec(m); end;

a_h:=a_h+p_a;

Write_ab(a_h,a_l);

a_h:=0; a_l:=0; b_h:=0; b_l:=0; c_h:=0; c_l:=0;

p_a:=0; p_b:=0; m:=0; C:=0; p:=0; r:=0;

T:=0; k:=0; A:=0; B:=0; _B:=0;

z_a:=true; z_b:=true;

gotoxy(30,25);

textcolor(15);

writeln('Нажмите: Enter - чтобы продолжить и ');

write(' 1 - чтобы выйти');

d:=readkey;

if (d='1') then halt;

end;

end.

 

Ділення з відновленням залишку

 

program delen_s_vost_ost;

uses crt;

const n:byte=4; {точность вычислений}

var A,B,_B,T,k:integer; {A,B - содержат прямой код}

{_B - это '-В' в дополнительном коде}

p_b,p_a,m:byte;

i,j:byte; {параметры цикла}

C,P,r:real; {результат}

z_a,z_b:boolean; {знак чисел А и В}

a_l,b_l,c_l:word; {?_l мантисса двоичной записи}

a_h,b_h,c_h:shortint;

d :char;

procedure shr_ab(var a:shortint;var b:word);

begin {линейный сдвиг вправо двоичной записи}

for i:=1 to 15 do {shr b}

if (((1 shl i) and b)<>0) and (((1 shl (i-1)) and b)=0)

then b:=b+(1 shl (i-1)) else

if (((1 shl i) and b)=0) and (((1 shl (i-1)) and b)<>0)

then b:=b-(1 shl (i-1));

if ((1 shl 15) and b)<>0 then b:=b-(1 shl 15);

if odd(a) then b:=b+trunc(exp(15*ln(2)));

for i:=1 to 6 do {sar a}

if (((1 shl i) and a)<>0) and (((1 shl (i-1)) and a)=0)

then a:=a+(1 shl (i-1)) else

if (((1 shl i) and a)=0) and (((1 shl (i-1)) and a)<>0)

then a:=a-(1 shl (i-1));

if ((1 shl 6) and a)<>0 then a:=a-(1 shl 6);

end;

procedure Write_ab(a:shortint;b:word);

begin {вывод на экран двоичной записи}

for i:=7 downto 0 do

{ write(ord(((1 shl i) and a)<>0):2);

write('.');}

for i:=15 downto 0 do

write(ord(((1 shl i) and b)<>0):2);

Writeln(' ');

end;

procedure add(var a:integer;_b:integer); {сложение}

var t:integer;

p:word;

i:byte;

begin

p:=0;

T:=0;

for i:= 0 to 15 do {slogenie}

case ord(((1 shl i) and A)<>0)+ord(((1 shl i) and _B)<>0)+

ord(((1 shl i) and p)<>0) of

1:T:=T or trunc(exp(i*ln(2)));

2:p:=p or trunc(exp((i+1)*ln(2)));

3:begin

T:=T or trunc(exp(i*ln(2)));

p:=p or trunc(exp((i+1)*ln(2)));

end;

end;

A:=T;

end;

begin

while true do

begin

clrscr;

textcolor(13);

writeln('Ограничения:');

writeln('# Эта программа работает только с целыми числами, вводите их без знака');

writeln('# После ввода каждого исходного числа нажимайте Enter');

writeln('# Вывод результата на экран - в 2-байтовом поле, слева направо:');

writeln(' - не допускайте переполнения разрядной сетки!');

writeln(' - для знака результата бит не зарезервирован!');

writeln(' - в старших битах - переведенная в двоичный код целая часть результата!');

writeln(' - в остальных битах - дробная часть результата!');

writeln;

textcolor(15);

Writeln(' DELENIE S VOSSTANOVLENIEM OSTATKA ');

Writeln;

Write('A= ');

Readln(T);

write('bin:', ' ':3);

for k:=15 downto 0 do

write(ord(((1 shl k) and t) <>0):2);

writeln(' ');

if T<0 then z_a:=true; {знак}

T:=abs(T);

for i:=15 downto 0 do {представление в прямом коде}

if ord((1 shl i) and T)<>0 then A:=A + trunc(exp(i*ln(2)));

Write(#10#13,'B= ');

Readln(T);

write('bin:', ' ':3);

for k:=15 downto 0 do

write(ord(((1 shl k) and t) <>0):2);

writeln(' ');

if T<0 then z_b:=true;{знак}

T:=abs(T);

for i:=15 downto 0 do{представление в прямом коде}

if ord((1 shl i) and T)<>0 then B:=B + trunc(exp(i*ln(2)));

_B:=B;

if B>0 then _B:=_B + trunc(exp(15*ln(2))); {знак _B}

for i:=14 downto 0 do {инвертировать _B}

if ((1 shl i)and _B)=0 then

_B:=_B + (1 shl i) else _B:=_B - (1 shl i) ;

{перевод в дополнительный код}

inc(_B);

{вычисление целой части результата}

While A>=0 do begin

Add(A,_B);

if A>=0 then c:=c+1;

end;

{деление с восстановлением остатка}

Add(A,B);

for i:=1 to N do begin

for j:=14 downto 0 do {shl A}

if (((1 shl j) and A)<>0) and (((1 shl (j+1)) and A)=0)

then A:=A+(1 shl (j+1)) else

if (((1 shl j) and A)=0) and (((1 shl (j+1)) and A)<>0)

then A:=A-(1 shl (j+1));

if odd(A) then dec(A);

ADD(A,_B); {А-В}

if A >= 0 then C:=C + exp((-i)*ln(2)) {Сi=1}

else ADD(A,B); {А+В}

end;

if z_a xor z_b then c:=-c; {знак результата}

Writeln(#10#13,'C= ',c:N+4:N);

r:=C;

a_h:=abs(trunc(r));

if r<0 then a_h:=a_h + trunc(exp(7*ln(2)));

r:=frac(r);

i:=15;

while (r<>0) and (i<>0) do

begin

r:=r*2;

if trunc(r) <>0 then a_l:=a_l + trunc(exp(i*ln(2)));

dec(i);

r:=frac(r);

end;

for i:=6 downto 0 do {нахождение порядка числа a}

if ord((1 shl i) and a_h)<>0 then begin p_a:=i+1; break; end;

{перевод в формат с плавающей точкой}

m:=p_a;

while m<>0 do begin shr_ab(a_h,a_l); dec(m); end;

a_h:=a_h+p_a;

Write_ab(a_h,a_l);

a_h:=0; a_l:=0; b_h:=0; b_l:=0; c_h:=0; c_l:=0;

p_a:=0; p_b:=0; m:=0; C:=0; p:=0; r:=0;

T:=0; k:=0; A:=0; B:=0; _B:=0;

z_a:=true; z_b:=true;

gotoxy(30,25);

textcolor(15);

writeln('Нажмите: Enter - чтобы продолжить и ');

write(' 1 - чтобы выйти');

d:=readkey;

if (d='1') then halt;

end;

end.

 

Зміст звіту

6.6.2. Звіт може бути роздрукований. 6.6.3. Звіт виконують українською мовою. 6.6.4. У звіті мають бути вказані:

Контрольні запитання

2. Чим відрізняється схема ділення без відновлення залишку від схеми ділення з відновленням залишку? 3. Намалювати схему алгоритму виконання ділення під час формування цілої… 4. Намалювати схему алгоритму виконання ділення без відновлення залишку, а також з відновленням залишку під час…