Domanda

Può qualcuno mi spieghi come convertire BCD per esadecimale? Per esempio come posso convertire 98 (BCD) a esadecimale. Grazie.

È stato utile?

Soluzione

Non capisco la tua domanda, ma credo che per esempio qualcuno ti dà un numero di 98 codificato in BCD, che sarebbe:

1001 1000

e si suppone di ottenere:

62H

Quello che vorrei proporre:

1) convertire il valore BCD codificato al valore decimale (D)

2) convertire D al valore esadecimale.

A seconda del linguaggio di programmazione scelto, questo compito sarà più facile o più difficile.

EDIT: In Java potrebbe essere:

    byte bcd = (byte)0x98; // BCD value: 1001 1000

    int decimal = (bcd & 0xF) + (((int)bcd & 0xF0) >> 4)*10;

    System.out.println(
            Integer.toHexString(decimal)
    );

Altri suggerimenti

BCD è un sottoinsieme di esadecimale, quindi non c'è conversione necessaria - ogni valore dato BCD è identico al valore esadecimale corrispondente. Ad esempio, '98' in BCD è 10011000, che è la stessa come 98 in esadecimale

Per ogni valore codificato BCD (che si inserisce in un int).

iterativo:

unsigned int bcd2dec(unsigned int bcd)
{
    unsigned int dec=0;
    unsigned int mult;
    for (mult=1; bcd; bcd=bcd>>4,mult*=10)
    {
        dec += (bcd & 0x0f) * mult;
    }
    return dec;
}

ricorsivo:

unsigned int bcd2dec_r(unsigned int bcd)
{
    return bcd ? (bcd2dec_r(bcd>>4)*10) + (bcd & 0x0f) : 0; 
}

mi piacerebbe creare una tabella di 256 voci, mappando tutti i byte BCD nel loro equivalente binario; è quindi possibile utilizzare la stampa esadecimale del linguaggio di programmazione.

Vai tra le diverse combinazioni di Hex, decimale e binario. Se sai come funziona binari allora si dovrebbe facilmente essere in grado di utilizzare BCD:

Hex  Dec  BCD
0    0    0000
1    1    0001
2    2    0010
3    3    0011
4    4    0100
5    5    0101
6    6    0110
7    7    0111
8    8    1000
9    9    1001
A   10    0001 0000 <-- notice that each digit looks like hex except it can only go to 9.
B   11    0001 0001
C   12    0001 0010
D   13    0001 0011
E   14    0001 0100
F   15    0001 0101

Una volta che hai questa parte di esso verso il basso, si dovrebbe essere in grado di utilizzare dividere per 10 o 10% per trovare combinazioni per generare il GAV. Dal momento che utilizza solo 10 combinazioni invece di tutti i 16 si perderanno alcune informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top