Newsgroup: it.comp.lang.c++
Titolo: significato di &

Scusate per l'ignoranza... Vorrei sapere la funzione dell'operatore & in una
istruzione di confronto, tipo
if (lParam & 0x0004)
Grazie anticipatamente


Se (lParam AND-LOGICO bit 3)
Luc.

 Se (lParam AND-LOGICO bit 3)
AND-LOGICO ???
AND-BITaBIT detto anche BITWISE-AND.
E' ben diverso !!!
if(11 & 0x0004)
viene valutata come false !!!
visto che 11&4 e' 0.
Questo era l'and-bitabit.
if(11 && 0x0004)
viene invece valutata come true !!!
visto che sia 11 che 4 sono true.
Questo era l'and-logico.
Attenzione a non confondere gli operatori !!!
Questo e' un AND-BITaBIT !!! E la differenza e' grossissima !!!
(come hai visto dall'esempio).
Alex

 E' ben diverso !!!
Intendevi forse dire:"and logico tra il terzo bit di lParam ed il terzo
della bit-mask"???
Nonostante non mi piaccia per NULLA come definizione almeno questa non e'
TOTALMENTE sbagliata.
Ma con una maschera (in binario) del tipo : 0101110111001010 come lo avresti
definito ?
Credo che l'unica vera maniera per definire l'operazione di AND bit a bit
sia la solita:
Operazione &:
A  B  =   R
---------------
0   0   =   0
0   1   =   0
1   0   =   0
1   1   =   1
---------------
In pratica l'and tra due bit e' 1 solo quando entrambi i bit sono 1.
0011010101000111  &        (13.639 in base 10)
0000100100001110  =         (2.318 in base 10)
---------------------------------
0000000100000110            (262 in base 10)
E' vero che tra ogni singolo bit di 13.639 e 2.318 esegui una SPECIE di
and-logico, ma credo che la tua risposta fosse imprecisa e piu' che altro
possibile fonte di grande confusione...
Alex

della bit-mask"???
Ho scritto AND-LOGICO bit 3, leggi meglio la prox. volta (e non darmi
lezioncine su queste cose...).
Luc.

 if (lParam & 0x0004)
Prima valuti l'espressione lParam&0x0004 (come spiegato nella mia risposta
alla mia risposta al messaggio di Luc in risposta alla tua domanda ;-)
Una valutata l'espressione, cioe' una volta che sai quanto fa lParam&0x0004
il tutto diventa:
if (valore) dove valore e' appunto il risultato di lParam&0x0004.
Come tu ben sai if restituisce true con qualsiasi valore diverso da 0, in
pratica e' come se tu avessi if(valore!=0). In parole povere se il valore
risultante da lParam&0x0004  e' 0 l'if risulta false, se il valore e' un
qualsiasi valore diverso da 0 allore l'if risulta true.
Alex
Ma lParam quello di win32 ??? Sei gia' alla programmazione win32 e non sai
ancora il significato di un cosi' semplice costrutto C/C++ ?!?

> come lo avresti definito ? (in stile AND-LOGICO bit 3)
Aspetta fammi indovinare ....
AND-LOGICO bit 2,4,7,8,9,11,12 e 15 che come vedi e' INESATTA !!!
La tua spiegazione andava quasi bene solo perche' il bit attivo era solo 1 !
(ma in questo modo confondi le persone!). Altrimenti ti accorgi che se non
vuoi incasinare ancora di piu' la tua spiegazione mischiando gli "AND-LOGICI
di ogni singolo bit attivo della maschera con quelli dei relativi bit di
lParam e fare gli OR-LOGICI di tutti questi singoli risultati booleani",
devi per forza dare la solita e giusta spiegazione "accademica**" !
Se non hai capito la frase tra virgolette non ti preoccupare, e' quasi
incomprensibile, infatti ho seguito la tua "spiegazione" ;-)
Alex
** si valuta prima l'espressione tra parentesi e poi si ottiene if(valore).
Come si valuti tale espressione gia' l'ho scritto nel precedente
messaggio... (anche come si valuti if(valore)).

if (lParam & 0x0004)
Testa il terzo bit di lParam. 
Se questo e' 0 allora l'intera espressione e' 0, altrimenti
vale 0x0004 e quindi l'intera espressione e' vera.
L'operatore & si usa per l'and logico bit a bit secondo la
seguente tavola di verita' :
A   B   A & B
0   0     0
0   1     0
1   0     0
1   1     1
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>