Newsgroup: it.comp.lang.c
Titolo: OPERARE SUI SINGOLI BIT...come?

Salve a tutti. In pratica quello che mi serve č, data una variabile char
(che come sappiamo č lunga 8 bit), operare sui singoli bit. In pratica devo
poterli modificare a mio piacimento, e poi reinserire ancora nella variabile
char, in modo da ottenere uno dei 256 char possibili (per ora non mi
interessa della corrispondenza...).
Cioč, se io volessi ad esempio fare in modo che la variabile contenga questi
8 bit: 10010011, come posso fare?
E come uso gli operatori di bitwise su quella variabile? Su Internet non ho
trovato nulla che mi chiarisse le idee a sufficienza...
GRAZIE!!!

         unsigned char *ptr=bstr;
           ^^^^^^^^
           Inutile.
-- 
Alla prossima,
Marco

 trovato nulla che mi chiarisse le idee a sufficienza...
   Internet e` una grande fonte di informazione, ma piu` di lei lo sono 
i libri. Se ancora non lo possiedi, ricerca ed acquista, di Kernighan e 
Ritchie, "Linguaggio C Seconda edizione", al momento uno degli /entry/ 
/point/ piu` accreditati al linguaggio.
   Ad ogni modo, un rapido elenco degli operatori /bitwise/ previsti dal 
linguaggio puo` essere:
	&	operatore *and*;
	^	operatore *or esclusivo*;
	|	operatore *or inclusivo*;
	<<	*shift* a sinistra;
	>>	*shift* a destra.
--
Alla prossima,
Marco

 retval<<=1;
Non hai dato un valore init a retval...(non insegnare abitudini cattivi!)
:-)
J.

 questi 8 bit: 10010011, come posso fare?
Potresti  utilizzare  le potenze  di  due  e  gli operatori  logici  per
alzare/testare/abbassare un determinato bit.
Immagina che il char sia composto da 8bits numerati da 0 a 7:
01234567
Per alzare il bit n devi fare un OR (bitwise) tra la variabile stessa e
2^n.
Es:
char a = 0;
a |= (int) pow(2, 4);
Alza il bit 4.
Per testare il bit n fai un AND tra la variabile e 2^n.
Es:
char a;
...
if ((a & (int)pow(2, 4)) != 0)
	printf("bit 4 = 1\n");
else
	printf("bit 4 = 0\n");
Per abbassare il bit n fai un AND tra la variabile ed il complemento a 1
di 2^n.
Es:
char a;
a &= ~(int)pow(2, 4);
Abbassa il bit 4.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se non puoi convincerli, confondili.

 8 bit: 10010011, come posso fare?
La tecnica che uso di piu' e' di usare rappresentazioni esadecimali.
Sono facile da convertire in bit set.
nel tuo specifico esempio 10010011 dividi il valore in parti da 4 bit
ciascuno 1001 . 0011
fa la somma dei componenti singoli
    8*1 + 4*0 + 2*0 + 1*1 = 8+1=9 e
    8*0 + 4*0 + 2*1 + 1*1 = 2+1=3
esadecimale diventa 0x93...
unsigned char val=0x93;
Dopo un po' ti abitui a farlo senza calcolare troppo e tanti valori sono
scontati, quando vedi ad esempio un 1111 diventa automaticamente un F, b0000
1111 := 0x0F;
per calcolare usi gli operatori classici: & | ^ ~ per operare sui singoli
bit i (sapendo che 0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80 sono i valor per i
singoli bit (da destra a sinistra)).
Spesso si usa ad esempio nella programmazione Hardware di settare un singolo
bit.
Per settare il primo bit in una variabile fai semplicemente:
v=v | 0x01; (va bene anche v |= 1; )
L'ultimo bit di un byte con: v = v | 0x80;
togliere quel bit: v= v & 0x7F; // b0111 1111 := 0x7F
Gioca un po' con questo cose, li vedrai ognitanto nei sorgenti
J.

 variabile
Potresti utilizzare una union contenente una variabile char e una struttura
di campi a bit