![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Двоично-десятичные числа
kat © (2002-04-27 10:11:00)Меня попросили написать курсовую "Вычитание двоично-десятичных чисел". Там сначало надо преобразовать двоичные числа в двоично десятичные, потом вычесть, а потом опять преобразовать к двоичному числу. Может быть кто-нибудь делал что-то такое, не могли бы помочь с кодом? Пожалуйста
Anatoly Podgoretsky (2002-04-27 15:48:00) [1]625-E3
Я бы подсказал, как но нет под рукой документации, знаю, что это 10 байт структура и старший байт хранит информацию о порядке и знаке числа, вроде бы FPU это напрямую поддерживает, но возможно ошибаюсь
MBo (2002-04-27 15:40:00) [2]это 0.101 в двоичной, а как в BCD нормализация и порядок делается, не знаю.
kat (2002-04-27 15:34:00) [3]Не понятно стало малость
А как например 0.625 в 10-системе представить в 2-10системе?
А то я запуталась
Anatoly Podgoretsky (2002-04-27 14:11:00) [4]kat © (27.04.02 13:39)
О так ты о чистом BCD, там первый байт хранит значение о порядке, правила особые
MBo (2002-04-27 13:45:00) [5]просто объедини две функции в одну.
поиском в yandex найдешь кучу ссылок
kat (2002-04-27 13:39:00) [6]MBo © (27.04.02 13:19) спасибо
Но сделано что сначало 2-ой число переводится в 10-ое, а только потом в 2-10-ое.
Нужен алгоритм непосредственного перевода из 2-ой системы в 2-10систему. И числа могут быть не только целые.
И вообще дурацкое задание. Но что-нибудь придумаю
MBo (2002-04-27 13:19:00) [7]Держи, Катюша
function BinStrToInt(s:string):integer;
var i,k:integer;
begin
result:=0;
k:=0;
for i:=length(s) downto 1 do begin
Result:=Result or ((ord(s[i])-ord("0")) shl k);
inc(k);
end;
end;
function IntToBCD(i:integer):Integer;
var k:integer;
begin
k:=0;
Result:=0;
while i>0 do begin
Result:=Result or ((i mod 10) shl k);
inc(k,4);
i:=i div 10;
end;
end;
function BCDAdd(b1,b2:integer):integer;
var i,j,perenos:integer;
begin
Result:=0;
perenos:=0;
for i:=0 to 7 do begin
j:=perenos+((b1 shr (4*i)) and $F)+((b2 shr (4*i))and $F);
Result:=Result or ((j mod 10) shl (4*i));
perenos:=j div 10;
end;
end;
function BCDToInt(b:integer):integer;
var k:integer;
begin
result:=0;
k:=1;
while b>0 do begin
Result:=Result + k*(b and $F);
b:=b shr 4;
k:=k*10;
end;
end;
function IntToBinStr(I:integer):string;
begin
Result:="";
while i>0 do begin
Result:=Chr((I and 1)+$30)+Result;
I:=I shr 1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s1,s2:string;
ibcd1,ibcd2,ibcd3:integer;
begin
s1:=edit1.text;
ibcd1:=IntToBCD(BinStrToInt(s1));
s2:=edit2.text;
ibcd2:=IntToBCD(BinStrToInt(s2));
ibcd3:=BCDadd(ibcd1,ibcd2);
label2.caption:=InttoBinStr(BCDToInt(ibcd3));
end;
aabark (2002-04-27 12:57:00) [8]Дело это не очень страшное .
Лет 20 назад я этим занимался на ЕС ЭВМ .
Была даже программа перевода чисел текст
( одна тысяча двести восемьдесят руб. 00 коп ) .
Максимально двочно-десятичное число на ЕС могло
иметь только 15 цифр ( + знак ) !!
Когда Егорушко Гайдар пришел к власти -
нам 15 цифр стало нехватать , но тут я с завода
ушел в "свободное плавание" и в , часности ,
на Delphi 1.0 + IB4 ( NetWare ) в банке
написал ряд задач .
Вот такие ассоциации вызвал ваш вопрос ...
Дерзайте , молодые , дерзайте ...
MBo (2002-04-27 12:35:00) [9]вот в bcd перевод
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ["0","1",#8,#9,#13]) then key:=#0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var sbin:string;
i,k,ibcd:integer;
idec:integer;
b:byte;
begin
sbin:=edit1.text;
k:=0;
idec:=0;
for i:=length(sbin) downto 1 do begin
b:=ord(sbin[i])-ord("0");
idec:=idec or (b shl k);
inc(k);
end;
label1.caption:=inttostr(idec);
k:=0;
ibcd:=0;
while idec>0 do begin
b:=idec mod 10;
ibcd:=ibcd or (b shl k);
inc(k,4);
idec:=idec div 10
end;
label2.caption:=inttostr(ibcd);
end;
Romkin (2002-04-27 12:30:00) [10]38 Hex = 56 dec = 0011 1000 bin
BCD: 56 (0101 0110 bin) - упакованный
0506H - неупакованный
Если не ошибаюсь :-))
Есть алгоритм простого преобразования байта в BCD, без делений по модулю - только логические операции. Позабыл вот только
kat (2002-04-27 11:48:00) [11]строки
MBo (2002-04-27 11:33:00) [12]двоичные даны в виде Integer или строк "10010011"
kat (2002-04-27 11:28:00) [13]оба, хотя бы упакованный увидеть, неупакованный аналогично
MBo (2002-04-27 11:21:00) [14]а тебе упакованный или нет?
kat (2002-04-27 11:20:00) [15]А никто не встречал такого алгоритма на паскале?
Anatoly Podgoretsky (2002-04-27 10:49:00) [16]kat © (27.04.02 10:11)
Ромкин ответил, можно конечно и без АСМ, но морока
AFROLOV © (27.04.02 10:20)
BCD
Alx2 © (27.04.02 10:24) & Romkin © (27.04.02 10:24)
Может и байт занимать, упакованные и неупакованные
kat © (27.04.02 10:31)
О прекрасно разбираешься с темой!
kat © (27.04.02 10:35)
Черех операции деления по модулю 10
N div 10, N mod 10 и дальше ручная упаковка по байтам.
kat (2002-04-27 10:35:00) [17]http://www.atmel.ru/AVR/BINBCD.htmя нашла, только не поняла как преобразовать Например
11001001 в 2-системе к 2-10системе
kat (2002-04-27 10:31:00) [18]Расскажу на примере
Есть число 57319 - в десятичной системе
Его можно преобразовать к упакованному и неупакованному виду 2-10системы
|05|73|09
0000 0101|0111 0011|0001 1001 -упакованный
57319
0000 0101|0000 0111|0000 0011|0000 0001|0000 1001 -неупакованный
MBo (2002-04-27 10:25:00) [19]http://www.atmel.ru/AVR/BINBCD.htm
поиск
Romkin (2002-04-27 10:24:00) [20]У x86 архитектуры исторически есть все команды ассемблера и для преобразований, и для операций с двоично-десятичными числами. Просто найди учебник по ассемблеру, и оттуда
2AFROLOV : это когда 4 бита используются для записи числа от 0 до 9, поэтому байт содержит 2 цифры, и всего от 0 до 99