Binary Coded Decimal (BCD)
От: Dima2  
Дата: 01.08.02 07:14
Оценка:
Помогите может у кого валяется готовый алгоритм преобразования в BCD и обратно.
Блин помню когда-т описал, а щас не найду.

Пример:

BCD код == 0x4711 это равно 4711 десятичное
Re: Binary Coded Decimal (BCD)
От: Edmond  
Дата: 01.08.02 07:27
Оценка:
Здравствуйте Dima2, Вы писали:

D>Помогите может у кого валяется готовый алгоритм преобразования в BCD и обратно.

D>Блин помню когда-т описал, а щас не найду.

D>Пример:


D>BCD код == 0x4711 это равно 4711 десятичное


Во первых ты не уточнил: упакованное/ не упакованное...
То что ты привёл упакованное...

Ничего особово в алгоритме нет...

Как образец смотри команды x86 коррекции, которые и осуществляют коррекцию

AAD — Ascii Adjust for Division
Usage: AAD
Modifies flags: SF ZF PF (AF,CF,OF undefined)
Used before dividing unpacked decimal numbers. Multiplies AH by
10 and the adds result into AL. Sets AH to zero. This instruction
is also known to have an undocumented behavior.
AL := 10*AH+AL
AH := 0


AAM — Ascii Adjust for Multiplication
Usage: AAM
Modifies flags: PF SF ZF (AF,CF,OF undefined)
AH := AL / 10
AL := AL mod 10
Used after multiplication of two unpacked decimal numbers, this
instruction adjusts an unpacked decimal number. The high order
nibble of each byte must be zeroed before using this instruction.
This instruction is also known to have an undocumented behavior.

Clocks Size

Пошли эту тему в Assembler, пусть тебе составять самый быстрый декодер
С уважением, Edmond
Re[2]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 01.08.02 08:16
Оценка:
Здравствуйте Edmond, Вы писали:

E>Пошли эту тему в Assembler, пусть тебе составять самый быстрый декодер


Да мне самый быстрый не надо, устроит и на С++.
А как asm инструкция для десятичной коррекции, не помню то ли edc, то ли dac?
Re[3]: Binary Coded Decimal (BCD)
От: Eugenue Россия  
Дата: 01.08.02 14:09
Оценка: 10 (1)
Здравствуйте Dima2, Вы писали:

D>Здравствуйте Edmond, Вы писали:


E>>Пошли эту тему в Assembler, пусть тебе составять самый быстрый декодер


D>Да мне самый быстрый не надо, устроит и на С++.

D>А как asm инструкция для десятичной коррекции, не помню то ли edc, то ли dac?

У Боба Стоута в snippets прекрасный пример на C, www.snippets.org, если не найдете могу выслать. Но snippets вроде у кождого есть... или должен быть...
Backup not found!
(A)bort (R)etry (P)anic (B)eer
Re[4]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 01.08.02 14:28
Оценка:
Здравствуйте Eugenue, Вы писали:

E>У Боба Стоута в snippets прекрасный пример на C, www.snippets.org, если не найдете могу выслать. Но snippets вроде у кождого есть... или должен быть...


У меня не было
Re: Binary Coded Decimal (BCD)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.08.02 08:33
Оценка:
Здравствуйте Dima2, Вы писали:

D>Помогите может у кого валяется готовый алгоритм преобразования в BCD и обратно.

D>Блин помню когда-т описал, а щас не найду.

D>Пример:


D>BCD код == 0x4711 это равно 4711 десятичное


Ну так в Intel x86 архитектуре для этого есть специальные команды
Посмотри любой справочник по ассемблеру
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Binary Coded Decimal (BCD)
От: Кодт Россия  
Дата: 05.08.02 16:57
Оценка: 10 (1)
Здравствуйте Dima2, Вы писали:

D>Помогите может у кого валяется готовый алгоритм преобразования в BCD и обратно.

D>Блин помню когда-т описал, а щас не найду.

D>Пример:


D>BCD код == 0x4711 это равно 4711 десятичное


Если абстрагироваться от x86.
Это же довольно просто. Аналогично преобразованию число/строка (только там char, а здесь тетрады)
unsigned bcd_to_bin(unsigned x)
{
  unsigned y = 0;
  while(x != 0)
  {
    assert((x & 0xF) < 10); // иначе это не BCD

    y *= 10;
    y += (x & 0xF);
    x >>= 4;
  }
  return y;
}

unsigned bin_to_bcd(unsigned x)
{
  assert(x < 100000000); // для 32-разрядных платформ

  unsigned y = 0;
  while(x != 0)
  {
    y <<= 4;
    y += (x % 10);
    x /= 10;
  }
  return y;
}
Перекуём баги на фичи!
Re[2]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 06.08.02 09:19
Оценка:
Здравствуйте Кодт, Вы писали:

К>Если абстрагироваться от x86.

К>Это же довольно просто. Аналогично преобразованию число/строка (только там char, а здесь тетрады)

Просто, то просто, но вот писать все заново не хотелось, плюс ко всему надо было сложение(деление...) в BCD коде. Перекидывать из BCD в десятичное, складывать, а затем опять пихать в BCD, не очень красиво, да и не всегда возможно, т.к. разрядности даже __int64 может не хватить, т.к. BCD число может быть трехэтажное.
Re[3]: Binary Coded Decimal (BCD)
От: Кодт Россия  
Дата: 06.08.02 11:23
Оценка:
Здравствуйте Dima2, Вы писали:

D>Здравствуйте Кодт, Вы писали:


К>>Если абстрагироваться от x86.

К>>Это же довольно просто. Аналогично преобразованию число/строка (только там char, а здесь тетрады)

D>Просто, то просто, но вот писать все заново не хотелось, плюс ко всему надо было сложение(деление...) в BCD коде. Перекидывать из BCD в десятичное, складывать, а затем опять пихать в BCD, не очень красиво, да и не всегда возможно, т.к. разрядности даже __int64 может не хватить, т.к. BCD число может быть трехэтажное.


А зачем проводить вычисления в BCD?
Может, проще внутреннее представление сделать бинарным, и конвертировать только в моменты экспорта-импорта?
И потом, если не хватит разрядности __int64, то ее и так и этак не хватит (если переполнение — штатная ситуация).

...
Если очень нужно, изобретем велосипед. Даже посодействую...
Перекуём баги на фичи!
Re[4]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 06.08.02 12:06
Оценка:
Здравствуйте Кодт, Вы писали:

К>А зачем проводить вычисления в BCD?

К>Может, проще внутреннее представление сделать бинарным, и конвертировать только в моменты экспорта-импорта?
Ну например во что ты будеш конвертировать 20-ти разрядное BCD число? В __int64 оно может не влезть.
А мне необходимо делать какие-либо действия над этими числами, например сложить их.
Re[5]: Binary Coded Decimal (BCD)
От: Кодт Россия  
Дата: 06.08.02 13:53
Оценка:
Здравствуйте Dima2, Вы писали:

D>Здравствуйте Кодт, Вы писали:


К>>А зачем проводить вычисления в BCD?

К>>Может, проще внутреннее представление сделать бинарным, и конвертировать только в моменты экспорта-импорта?
D>Ну например во что ты будеш конвертировать 20-ти разрядное BCD число? В __int64 оно может не влезть.
D>А мне необходимо делать какие-либо действия над этими числами, например сложить их.

Дааа. Тяжко...

Окэй
typedef unsigned char byte;

void bcd_add(byte& a, byte b, bool& c)
// [in out] a - accumulator
// [in]     b - increment
// [in out] c - carry flag
{
  assert((a & 0xF) <= 9);
  assert((b & 0xF) <= 9);
  assert((a & 0xF0) <= 0x90);
  assert((b & 0xF0) <= 0x90);

  byte t1 = (a & 0xF) + (b & 0xF) + c; // младшая тетрада
  if(t1 > 10) t1 += 6; // коррекция: 0x0A..0x12 -> 0x10..0x18

  byte t2 = (a >> 4) + (b >> 4) + (t1 >> 4); // старшая тетрада
  if(t2 > 10) t2 += 6;

  a = (t1 & 0xF) | (t2 << 4);
  c = (t2 > 0x10);
}

void bcd_add_vector(byte* a, const byte* b, bool& c, size_t s)
// младшими разрядами вперед, длиной s
{
  size_t i;
  for(i = 0; i < s; i++)
    bcd_add(a[i], b[i], c);
}

template<class inttype>
void bcd_add_int(inttype& a, inttype b, bool& c)
{
  bcd_add_vector((byte*)(void*)(&a), (const byte*)(const void*)(&b), c);
}


С вычитанием надо почесать голову...

Продолжить?
Перекуём баги на фичи!
Re[6]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 07.08.02 06:24
Оценка:
Здравствуйте Кодт, Вы писали:

Ха, нашел. Но вычитания не делал, т.к. пока не надо

int AddBCD(char* n1, char* n2, int *len)
{
    int l = *len;

    __asm {
        push eax
        push ebx
        push ecx
        push edx

        mov ecx, l
        mov ebx, n1
        mov edx, n2
        clc
ccc:    mov al, [ebx]
        adc al, [edx]
        daa
        mov [ebx], al
        inc ebx
        inc edx
        loop ccc

        jnc ccc1
        mov [ebx], 1
        inc l

ccc1:    pop edx
        pop ecx
        pop ebx
        pop eax
    };

    *len = l;
    return 0;
}
Re: Binary Coded Decimal (BCD)
От: Кодт Россия  
Дата: 08.08.02 07:41
Оценка:
Здравствуйте Dima2

А не знаешь, как кодируются отрицательные числа?
— обозначается знак "-"
— дополнение — по модулю 10^n: -0001 mod(10^4) == 9999

Во втором случае вычитание сводится к сложению с дополнением числа.
Перекуём баги на фичи!
Re[2]: Binary Coded Decimal (BCD)
От: Dima2  
Дата: 08.08.02 11:17
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте Dima2


К>А не знаешь, как кодируются отрицательные числа?


Ты знаеш не могу, сказать. Но скорее всего с дополнением, т.к. было бы странно вставлять ASCII код для "-" в BCD число.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.