Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626

    [C++]conversione interi a x bit a 16 bit

    Ciao a tutti,

    Ho un problema ad ottenere il corrispondente valore signed short partendo da 2byte i cui bit significativi sono 10 o 14.
    Questi valori li prendo da una scheda esterna collegata tramite seriale/usb.

    Ad esempio, se acquisisco questi due byte:

    00000011 11111111 (2^15 .. 2^0)

    ed i bit significativi sono 10 (il decimo è il bit di segno), dovrei interpretarlo come -1 e non come 1023.
    Chiaramente non ha senso spostare il solo bit di segno (copio il 10mo al 16mo posto) perchè in questo caso

    00000011 11111111 (10bit) => 11111111 11111111 (16bit)

    Qualcuno sa dirmi che formula posso usare per ottenere il corrispondente intero a 16bit partendo da un intero, con segno, ad x bit ?

    Grazie

  2. #2
    Fai un and sui soli bit non-di segno, quindi se il bit di segno è attivo aggiungi al risultato -2^(posizione bit segno).

    Supponendo che il tuo numero "raw" stia in uno short senza segno:
    codice:
    short rawtoshort(unsigned short raw, unsigned int bits)
    {
        unsigned short signmask=1<<(bits-1);
        return ((raw&signmask)?(-(short)signmask):0) + (raw&(signmask-1));
    }
    Questo funziona indipendentemente da come siano rappresentati gli interi sulla tua piattaforma. Se invece assumi che sia l'input che l'output siano in complemento a due, allora si può fare:
    codice:
    short rawtoshort(unsigned short raw, unsigned int bits)
    {
        unsigned short signmask=1<<(bits-1);
        raw|=(raw&signmask)?(~(signmask-1)):0;
        short ret;
        // necessario dato che in C il type-punning via cast di puntatori non è standard, e così pure un buon
        // numero di operazioni bit-a-bit sui tipi con segno
        memcpy(&ret, &raw, sizeof(ret));
        return ret;
    }
    in ogni caso, è più la fatica del guadagno usare questo secondo metodo in C, mentre con ogni probabilità è un pelo più efficiente/compatto rispetto all'altro se scritto direttamente in assembly.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    GRAZIE !!! adesso funziona (entrambi i metodi )

  4. #4
    Sorry, mi ero dimenticato un paio di parentesi; la versione corretta (aggiornata anche sopra) è:
    codice:
    short rawtoshort(unsigned short raw, unsigned int bits)
    {
        unsigned short signmask=1<<(bits-1);
        return ((raw&signmask)?(-(short)signmask):0) + (raw&(signmask-1));
    }
    http://ideone.com/opeDhp
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    eeee...avevo notato che restituiva solo la (-)maschera nel caso il bit segno fosse a 1

    Ti ringrazio nuovamente


  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

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.