PDA

View Full Version : [C] Spostamento di Byte


Spike79
08-06-2007, 12:07
Ciao, vi chiedo un aiuto....non conosco troppo bene il C, purtroppo, e mi trovo tra le mani questo codice Java da 'tradurre'....

ultimo>>>=1;
ultimo&=0x7f;
ultimo |=0x80;

Dovrebbe essere uno shift di byte...."ultimo" l'ho dichiarata char , perchè il byte di java non c'è, ma ora mi dà un errore di sintassi su quegli operatori....cosa devo scrivere ?
Grazie mille

andbin
08-06-2007, 12:19
ultimo>>>=1;
ultimo&=0x7f;
ultimo |=0x80;L'operatore >>> è caratteristico di Java e consente di fare uno shift a destra con "zero-extension", cioè uno '0' viene sempre inserito a sinistra.
In "C" non c'è uno shift del genere, solo quello "tradizionale" >> che però fa il sign extension (e dal momento che un char tipicamente è con segno, non fa quello che il codice sopra vorrebbe).

Quindi:
a) dichiari ultimo come unsigned char
b) fai:
ultimo >>= 1;
ultimo &= 0x7f;
ultimo |= 0x80;

mad_hhatter
08-06-2007, 12:20
certo che in java esiste il tipo byte!!

questo codice compila benissimo:

byte ultimo = (byte) 0xFF;
//shift a dx di 1 BIT con inserimento di bit a 0 nelle posizioni più significative
ultimo>>>=1;

ultimo&=0x7f;
ultimo |=0x80;

Spike79
08-06-2007, 12:29
certo che in java esiste il tipo byte!!

questo codice compila benissimo:

byte ultimo = (byte) 0xFF;
//shift a dx di 1 BIT con inserimento di bit a 0 nelle posizioni più significative
ultimo>>>=1;

ultimo&=0x7f;
ultimo |=0x80;

Intendevo che IN C , il Byte di Java non c'è....

Ora dice che:

ultimo&=0x7f; ----- '&=' : illegal, left operand has type 'unsigned char [1]'
idem per le altre righe.

cionci
08-06-2007, 13:19
Devi dichiararlo solo come unsigned char...

unsigned char ultimo;

Spike79
08-06-2007, 14:00
Ok, però ora dice
ultimo>>>=1; ----- syntax error : '>='

e poi ho lo stesso problema con una array di char:

char *buf_tot;

buf_tot[i]>>>=1;
buf_tot[i]&=0x7f;
buf_tot[i] |= 0x80;

cionci
08-06-2007, 15:17
Non esiste l'operatore >>> in C. Devi usare >> accompagnato da unsigned char...

unsigned char *buf_tot;

buf_tot[i] >>= 1;
buf_tot[i] &= 0x7f;
buf_tot[i] |= 0x80;

Spike79
08-06-2007, 15:47
Perfetto, ora mi pare a posto!!!
grazie mille!
Siete stati preziosi.