Автор: Acad 19.01.2003 4:58
Сложение и вычитание в двоичной системе.
Кто поможет?
Автор: mj 19.01.2003 5:08
1 + 0 = 1, 1 + 1 = 10, а дальше как обычное сложение
пример: 00101001 + 00010001 = 00111010
10 - 1 = 1, 1 - 1 = 0, а дальше как обычное вычетание
пример: 00101001 - 00010001 = 00011000
Автор: Acad 19.01.2003 5:31
Я имел в виду не саму двоичную арифметику, а реализацию этого на Pascal'е...
То есть:
program BinMinus;
write('Введите первое число в двоичной системе счисления: ');
readln...
write('Введите второе число в двоичной системе счисления: ');
readln...
...считаем...
write('Результат равен: ');
...
end.
Меня интересует что написать вместо ...считаем..., а то у меня не получается
Автор: mj 19.01.2003 5:40
Можно сначала конвертировать в числовую переменную, сложить/отнять, а потом обратно...
А можно работать прям со строковыми данными...
Что из этого тебя интересует?
Автор: Acad 19.01.2003 5:52
Нужно со строковыми данными...
Кой-чего я уже написал:
Код
program BinMinus;
type massiv=array[1..20] of string;
var a,b,k,x,i,BOL,BTL:integer;BO,BT:string;BOm,BTm,BThm:massiv;
begin
writeln('---------------------------------------------------');
write('Введите первое число в двоичной системе счисления: ');
readln(BO);
write('Введите второе число в двоичной системе счисления: ');
readln(BT);
for i:=1 to 20 do
BOm[i]:=BO[i];
for i:=1 to 20 do
BTm[i]:=BT[i];
for i:=20 downto 1 do
begin
if (BOm[i]='0') and ((BTm[i]='0') or (BTm[i]=' ')) then BThm[i]:='0';
if (BOm[i]='1') and ((BTm[i]='0') or (BTm[i]=' ')) then BThm[i]:='1';
if (BOm[i]='1') and (BTm[i]='1') then BThm[i]:='0';
if (BOm[i]='1') and (BTm[i]='') then BThm[i]:='1';
if (BOm[i]='0') and (BTm[i]='1') then
begin
BThm[i]:='1';k:=i-1;
repeat
if BOm[k]='1' then
begin
BOm[k]:='0';x:=0;
end
else begin BOm[k]:='1';k:=k-1 end;
until x=0;
end;
end;
write('Результат равен: ');
for i:=1 to 20 do
write(BThm[i]);
end.
Но получилось запутанно и работает "не совсем" :-/
Можно ли проще?
Автор: mj 19.01.2003 5:57
Код
program BinMinus;
write('Введите первое число в двоичной системе счисления: ');
readln...
write('Введите второе число в двоичной системе счисления: ');
readln...
...
res := IntToBin(BinToInt(X1)-BinToInt(X2));
...
write('Результат равен: ');
...
end.
Автор: mj 19.01.2003 6:07
Код
function IntToBin(I: Integer): String;
begin
Res := '';
while I>0 do
begin
Res := Char((I and 1)+48)+Res;
asm
shr I, 1
end;
end;
IntToBin := Res;
end;
Автор: mj 19.01.2003 6:15
Код
function BinToInt(B: String): Integer;
var
F: Byte;
Res: Integer;
begin
Res := 0;
for F := 1 to Length(F) do
begin
if B[F]='0' then
begin
asm
shl Res, 1
end;
end;
if B[F]='1' then
begin
asm
shl Res, 1
or Res, 1
end;
end;
end;
BinToInt := Res;
end;
Автор: Acad 19.01.2003 6:21
Спасибо!
Все работает! :)
Функция перенесена в http://forum.pascal.net.ru/index.php?showtopic=4535&view=findpost&p=38393
Автор: mj 19.01.2003 6:33
а я и забыл что shr и shl в паскале тоже есть...