Pagina 1 di 2

Dubbio su condizione ciclo while

MessaggioInviato: 10 ago 2014, 22:08
da phase
Ciao!!
Ho una domanda, probabilmente banale, ma non ho mai usato queste sintassi (che ho trovato in vari codici) e non sono sicuro della loro interpretazione. :oops:

Codice: Seleziona tutto
while ( data & 0x80 ){
    ...
};


oppure

Codice: Seleziona tutto
while ((dato1 & 0x1F ) || ( dato2 & 0x04 ) );


so che & rappresenta un and bit a bit, però così si ottiene un byte (se dado 1 e dato 2 sono byte), cosa vuol dire avere una condizione su un byte? Deve essere 0xFF perché sia verificata (non penso possa essere così perché dato1 & 0x1F non potà mai dare come risultato 0xFF)? E cosa vuol dire fare un or logico tra due byte? :?: Spero di essere stato chiaro ad esporre il problema :?

Re: dubbio su condizione ciclo while

MessaggioInviato: 10 ago 2014, 22:17
da TardoFreak
In C qualsiasi condizione viene considerata false se vale 0 e vera se diverso da 0.
In pratica
Codice: Seleziona tutto
while(24) do_something();

Genererà un ciclo infinito poiché 24 è sempre diverso da zero.
La funzione logica or || è diversa dalla funzione bitwise or |. La prima lavora sui bit uno per uno, la seconda solo sui valori dei due operandi che saranno considerati veri se diversi da zero e falsi se uguali a zero.

Re: Dubbio su condizione ciclo while

MessaggioInviato: 11 ago 2014, 12:21
da phase
ok...
Quindi, ad esempio, nella sintassi:
Codice: Seleziona tutto
while ( data & 0x80 ) ...

la condizione sarà verificata ed uscirà dal ciclo quando data assumerà un valore "minore" a 0x8F, quindi con il primo bit pari a 0? :-|

Re: Dubbio su condizione ciclo while

MessaggioInviato: 11 ago 2014, 14:34
da emacar
phase ha scritto:ok...
Quindi, ad esempio, nella sintassi:
Codice: Seleziona tutto
while ( data & 0x80 ) ...

la condizione sarà verificata ed uscirà dal ciclo quando data assumerà un valore "minore" a 0x8F, quindi con il primo bit pari a 0? :-|

Ciao,
il while continua finché il valore all'interno della parentesi è uguale ad 1 per cui se vuoi ad esempio che il while continui per valori superiori a 5 ed esca per valori inferiori o uguali a 5 potresti scrivere:
Codice: Seleziona tutto
while (x>5) do_something()

perché, finche x è maggiore di 5, la disuguaglianza è verificata ed il risultato è quindi 1.

Re: Dubbio su condizione ciclo while

MessaggioInviato: 11 ago 2014, 23:59
da phase
Penso che non riesco a spiegarmi bene... :? :?
Allora mi è assolutamente chiaro che il ciclo terminerà quando la condizione non sarà più vera, ossia quando il suo valore logico sarà 0. Il problema della sintassi da me proposta è che la condizione del ciclo è data da un operazione bit a bit la quale darà come risultato un byte (se i due operandi sono byte) e non un bit... Quindi la mia domanda è: la condizione non sarà più soddisfatta ed uscirà dal ciclo quando il risultato dell'operazione varrà 0x00 (mi sono sbagliato nel post iniziale a dire 0xFF)?

Re: Dubbio su condizione ciclo while

MessaggioInviato: 12 ago 2014, 0:28
da TardoFreak
SI, uscirà quando il risultato numerico sarà zero.

Re: Dubbio su condizione ciclo while

MessaggioInviato: 12 ago 2014, 0:34
da phase
Grazie mille! :ok:

Re: Dubbio su condizione ciclo while

MessaggioInviato: 12 ago 2014, 0:36
da WALTERmwp
Ciao Foto Utentephase, come ti ha scritto @TardoFreak dipende poi dall'operatore che utilizzi.
In questo caso ...
phase ha scritto:CODICE: SELEZIONA TUTTO
while ( data & 0x80 ){
    ...
};
... il ciclo si interrompe se "data" assume valore diverso dall'esadecimale 0x80 (l'altro numero è una costante quindi è sempre tale).
Anche qui ...
phase ha scritto:CODICE: SELEZIONA TUTTO
while ((dato1 & 0x1F ) || ( dato2 & 0x04 ) );
... la condizione (dato1 & 0x1F ) risulterà "vera" se la variabile "dato1" avrà almeno un bit a uno in corrispondenza di un bit, a uno, della costante; la stessa considerazione vale per ( dato2 & 0x04 ).
I due risultati sono poi interpretati come stati logici dove, per il test del "while", vengono considerati "vero" o "falso" e posti in "or" tra loro.

Saluti

Re: Dubbio su condizione ciclo while

MessaggioInviato: 12 ago 2014, 0:43
da phase
WALTERmwp ha scritto:... il ciclo si interrompe se "data" assume valore pari a zero (l'altro numero è una costante quindi è sempre "vera").

Da come ho capito non è necessario che data sia uguale a zero... Se la costante vale 0b10000000, perché il ciclo si interrompa è necessario che data valga ad esempio 0b01111111, o comunque con il primo bit diverso da 0. Sbaglio? :?

Re: Dubbio su condizione ciclo while

MessaggioInviato: 12 ago 2014, 0:49
da WALTERmwp
Con l'operatore ( & ) e ( | ) vai a fare un test bit a bit tra i parametri (supponiamo siano due); in tal caso, ad esempio, applicando ( & ) varrebbe questo ...
phase ha scritto:Se la costante vale 0b10000000, perché il ciclo si interrompa è necessario che data valga ad esempio 0b01111111, o comunque con il primo bit diverso da 0.
... proprio perché viene eseguito un test bit a bit.

Con l'operatore ( && ) e ( || ) vai a fare un test logico tra i parametri.

Saluti