Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: da base dec a base esa

  1. #1

    da base dec a base esa

    ciao a tutti ho iniziato una nuova sfida, questa volta ho deciso di convertire un numero da base 10 a base 16...ho pertanto creato una funzione di questo tipo:

    void dec2hex(unsigned short input, char hexstring[4])
    {
    int i;
    for (i=0; i<4; i++)
    {
    hexstring[4-1-i]=input%16;
    input/=16;
    }
    }

    La mia domanda dunque è questa: esiste un modo analogo a:
    hexstring[4-1-i]=input%16;
    per fare la stessa cosa, in parole povere in quale altro modo si può scrivere quella stringa di codice?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: da base dec a base esa

    Originariamente inviato da informatici
    La mia domanda dunque è questa: esiste un modo analogo a:
    hexstring[4-1-i]=input%16;
    per fare la stessa cosa
    Innanzitutto basta notare che fare il modulo 16 equivale praticamente a fare la AND del valore con 15 (0xF). E fare la divisione per 16 equivale a fare lo shift a destra (>>) di 4 bit del valore.

    Poi comunque quel tuo codice non è completo. Hai sì ottenuto i valori delle singole cifre esadecimali (0-15) ma se vuoi memorizzarle come caratteri devi ottenere valori '0'...'9' 'A'...'F' (o le minuscole). Altrimenti nel tuo array hai solo dei char con valori 0-15 che non sono certo caratteri stampabili.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quindi te come faresti? Intendo dire come codice.

  4. #4
    per trasformare un numero tra 0 e 15 in un hex puoi usare
    codice:
    char n2hex (short n)
    {
            return n < 9 ? '0' + n : 'A' + n - 10; 
    }
    ciao

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    codice:
    #include <stdio.h>
    
    char* formatHex (unsigned short input, char *hexstr)
    {
        int i;
        unsigned short d;
    
        for (i = 0; i < 4; i++)
        {
            d = input & 0xF;
            hexstr[3-i] = (char) (d > 9 ? d+'A'-10 : d+'0');
            input >>= 4;
        }
    
        hexstr[4] = '\0';
        return hexstr;
    }
    
    int main (void)
    {
        unsigned short n = 29611;     /* 73AB in hex */
        char buf[5];
    
        printf ("%s\n", formatHex (n, buf));
        return 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Grazie un ultima domanda se io invece volessi usare questo prototipo di funzione, che deve rimanere inalterato:

    void dec2hex(unsigned short input, char hexstring[4])
    {
    CORPO DELLA FUNZIONE
    }

    cosa scrivereste all'interno del CORPO DELLA FUNZIONE?
    grazie ancora

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da informatici
    cosa scrivereste all'interno del CORPO DELLA FUNZIONE?
    Beh, scusa, il mio esempio non è chiaro? Con il tuo prototipo le uniche cose che non puoi fare sono mettere il nullo finale e ritornare il puntatore come invece ho fatto io.
    Chi userà la tua funzione deve sapere che la stringa non è terminata dal nullo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Giusto, ora sapendo che la mia stringa non è terminata dal vettore nullo, riusciresti a trovare
    un'alternativa di funzione, utilizzando il prototipo che ho scritto sopra?
    L'unica cosa per l'appunto che bisogna sapere è questa:

    Il vettore di caratteri hexstring NON è una stringa di caratteri, perché non è presente il
    carattere di terminazione ‘\0’. Non si possono quindi utilizzare su questo vettore le
    funzioni di manipolazione delle stringhe (strcpy, strcat, ecc.).
    Non è consentito l’uso della funzione pow o di altre funzioni per l’elevamento a potenza.
    La dichiarazione delle funzioni deve rimanere inalterata (il prototipo non va cambiato per nessun motivo).
    La stampa a video del risultato finale deve riportare la posizione delle cifre seguendo l’ordine: maggiore cifra significativa…minore cifra significativa.

  9. #9
    ma scusa non lo puoi fare tu? quali difficoltà trovi? mi sembra che la conversione sia banale.
    ciao
    sergio

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da informatici
    Giusto, ora sapendo che la mia stringa non è terminata dal vettore nullo, riusciresti a trovare
    un'alternativa di funzione, utilizzando il prototipo che ho scritto sopra?
    In che senso "alternativa"???? Guarda che nel mio esempio basterebbe togliere le ultime 2 righe della funzione (appunto quella che mette il nullo e l'altra che ritorna il puntatore) per avere un corpo che sarebbe assolutamente appropriato per il tuo prototipo!

    Poi come ho detto il chiamante deve sapere che la stringa non è null-terminated e quindi ... deve arrangiarsi se vuole stamparla: copiando i 4 caratteri in un altro buffer facendo poi seguire il nullo, stampando semplicemente i caratteri uno per volta o altro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.