Newsgroup: it.comp.lang.delphi
Titolo: Accesso al singolo bit di un dato di tipo BYTE

Ciao a tutti,
C'è modo, in delphi (2005) of course, di avere accesso al singolo bit di 
un dato di tipo BYTE? Mi spiego meglio, se la variabile X è un BYTE, e 
vale che so 178, vorrei poter accedere, preferibilmente in lettura e 
scrittura al singolo bit (10110010). Un po come in una stringa ho 
accesso alla singola lettera con stringa[x].
Attualmente per accedre al bit e modificarlo opero una conversione 
DEC/bin e viceversa, sto cercando un metodo piu veloce, in termini di 
tempo di calcolo.
(sto facendo esperimenti con una sk IO di recupero...).
ZioGian

Perchè non usi le maschere sui bit?
Mi spiego se il valore è 178 (esadecimale B2 - binario 10110010) per 
accedere al 2° bit (il primo 1 sulla destra per intenderci) basta usare:
If (MiaVar and $02) <> 0 Then <bit ad 1>
			 Else <bit a 0>
stessa cosa per la scrittura
MiaVar = MiaVar Or $02; // imposta ad 1
MiaVar = MiaVar And (Not $02) // imposta a 0
Ciao,
David	

microges ha scritto:

Ti ringrazio molto per il suggerimento, mi pare che sia esattamente 
quello che mi serve. Non sapevo che si potesse fare, semplicemente. Mi 
sai anche suggerire magari dove reperire informazioni piu dettagliate?
ZioGian

Be informazioni più dettagliate le potresti trovare in qualche tutorial 
per assembler o in qualche "spiegazione scolastica" un po' datata 
(diciamo 10-20 anni) in indirizzo informatico oppure, anche recente, di 
indirizzo elettrotecnico o telecomunicazioni
Ciao,
David

microges ha scritto:

Gras, intendevo sul mascheramento.
Cmq le info che mi ahi dato sono adeguate...ciao
Gian

Vediamo tento di spiegare io...
Prima di tutto dovresti sempre pensare in binario quando operi un 
mascheramento ma andiamo con ordine:
Controllare un bit:
Si usa l'operatore AND in maniera da eliminare tutti i bit che non ci 
servono in quanto la stessa torna 1 solamente se i due bit che si 
prendono in considerazione sono entrambi 1 quindi se per esempio abbiamo
22 in esadecimale ovvero 00100010 in binario e vogliamo controllare il 
2° bit dovremmo eseguire un AND mascherando tutti i bit che non ci 
servono e quindi utilizzeremo il binario 00000010 (2 in esadecimale)
il risultato sarà 00000010 e quindi per controllare se il bit era 1 o 0 
basterà controllare che il risultato sia diverso da 0
Riepiloghiamo:
($22 AND $02) <> 0 -> bit a 1 ovvero tradotto
00100010 AND
00000010 =
-----------
00000010 che è diverso da 0
Settaggio ad 1 di un bit:
Si utilizza la funzione OR che torna 1 se almeno un bit è 1 quindi se 
per esempio abbiamo 22 in esadecimale (00100010 in binario) e vogliamo 
settare ad 1 il 3° bit basterà eseguire un OR con 00000100 (4 in 
esadecimale):
($22 OR $04) = $26 ovvero tradotto
00100010 OR
00000100 =
----------
00100110  settato ad 1 il 3° bit
Settaggio di un bit a 0:
Si utilizzano gli operatori AND e NOT (negazione) in quanto la funzione 
AND si usa per non modificare la configurazione dei bit originale mentre 
  l'operatore NOT si usa per negare il bit che vogliamo settare a 0
Mi spiego....
vogliamo, dall'esadecimale 22 (00100010 in binario) settare a 0 il 2° 
bit quindi per prima cosa creiamo una variabile con il bit che vogliamo 
eliminare
Var = $02 ovvero (00000010 in binario)
Neghiamo questo valore in maniera da avere la maschera inversa
NOT Var = NOT 00000010 = 11111101
Ora eseguiamo l'AND con il numero originale (vedi controllare un bit) ed 
otteniamo (sempre in binario per capire meglio):
00100010 AND
11111101 =
------------
00100000  se ricordi l'operatore AND ritorna 1 solamente se entrambi i 
bit sono ad 1
Questo bordello tradotto diventa
($22 AND (NOT $02)) = $20 ovvero (00100010 AND (NOT 00000010)) = 00100000
Ciao,
David

 
grazie, molto esaustivo, ciao..
Ziogian