[Tech] Domanda di C

Franco Bagnoli bagnoli@dma.unifi.it
Mer 26 Maggio 2004 16:20:56 CEST


On Wed, 26 May 2004, Valerio Montagnani wrote:

> in binario il numero 128 è 10000000; secondo LE (Little Endian) 84 si
> rappresenta così: 0100 0101, cioè i bit meno significativi del numero da
> rappresentare, stanno nella parte alta del registro della memoria. Per
> amplificare il numero ho pensato di disassemblare il registro in due
> variabili: left = 0100 e right = 0101 e quindi shiftare i bit verso
> sinistra, per esempio di 4 posizioni (all'atto pratico questo significa
> moltiplicare per 16 il valore 0100 e 0101 separatamente). Il risultato
> ottenuto è effettivamente quello voluto: 01000000 01010000. Per
> rappresentare questi ultimi numeri ho usato due variabili di tipo int.
> 
> Il problema arriva ora: come faccio a rappresentare il numero
> correttamente amplificato in una variabile sola di tipo int secondo le
> specifiche LE? In altre parole come creo la sequenza 16 (01000000) 80
> (01010000) in un solo intero?

difficile zippare 32 bit su soli sedici....

l'unica cosa che puoi fare (secondo me) è 

1) convertire il numero in un intero (16 bit)
2) amplificare il numero tenendo conto della limitazione, ovvero usando un 
controllo per evitare che 'trasbordi', se il segnale oscilla molto mi sa 
che devi "tagliare" i picchi più alti
3) ricodificare il tutto nella base di partenza.

Credo che con una union con una struttura (esempio da manuale) possa 
farcela:

union {
 unsigned little-endian;
 struct {
  unsigned char low;
  unsigned char high;
 } data;
} x;

x=<dato>
y = x.data.low | (x.data.high<<8);
(qualche operazione su y)
ecc. ecc. 

puoi anche usare due strutture, se vuoi evitare di shiftare i bit, oppure 
fare tutto con gli shift. 

per amplificare puoi anche convertire il numero in double, moltiplicarlo e 
manipolarlo in maniera appropriata usando funzioni tipo arrcotangente 
iperbolica per mantenerlo nel range giusto, ma non so quanti dati devi 
trattare. 







-- 
Franco Bagnoli (franchino) <bagnoli@dma.unifi.it> 
virtual location: Dipartimento di Energetica "S. Stecco"
ultra-virtual affiliation: Centro Dinamiche Complesse (CSDC-Firenze)
real location: Dip. Matematica Applicata "G. Sansone", Universita' Firenze,
Via S. Marta, 3 I-50139 Firenze, Italy. Tel. +39 0554796422, fax: +39 055471787




Maggiori informazioni sulla lista flug-tech