Newsgroup: it.scienza.informatica
Titolo: c++

Ciao c'è qualc'uno che può darmi una mano a fare un controllo per vedere se
un numero intero è pari o dispari?

 un numero intero č pari o dispari?
  Ci sono due metodi che puoi usare uno piu' intuitivo
ma meno veloce, l'altro meno intuitivo ma piu' veloce
sia N il numero che vuoi testare
1. metodo
si basa sull'idea che un numero pari e' divisibilie per due
mentre un numero dispari qunado viene diviso per due
ha il resto di uno
Dividiamo N/2 ed analizziamo il resto
se il resto e' zero allora il numero e' pari altrimenti il numero e' dispari
in C++ vi e' gia un operazione che restituisce il resto di una divisione
si chiama 'modulo' ed indicato con %
int test = N%2;
la variabile test rappresenta il resto della divisione N/2
quindi
if (test)
    // il numero e' dispari
else
    // il numeroe' pari
2. metodo
questo metodo e' piu' veloce del primo
e prende spunto dalla rappresentazione binaria dei numeri
un numero dispari ha, nella rappresentazione binaria, come cifra meno significativa un 1
mentre un numero pari ha uno 0
per distinguere quindi i numeri pari da quelli dispari
bisogna andare a vedere quale e' la cifra meno significativa ...
a tale scopo bisogna usare le operazioni che lavorano bit a bit
queste sono
AND bit a bit ed e' indicato con '&'
OR bit a bit ed e' indicato con '|' (non e' una i)
NOT bit a bit e' indicato con '~'
per vedere che valore ha il bit meno significativo
facciamo & tra il numero N ed 1
infatti
1 ha una rappresentazione in binaria (considero che un int abbia 16 bit)
0000000000000001
sia N = 5 il numero di cui si vuole testare la parita'
N e rappresentato
0000000000000101
facendo and bit a bit tra N ed 1 tutti i bit dal 15 al 1
saranno 0 mentre il bit 0 sara' pari ad 1
concludendo le linee di codice saranno
int test = N & 1
if (test)
    // il numero e' dispari
else
    // il numero e' pari
Questo metodo e' piu' veloce in quanto
si evita di fare una divisione (quello che richiedava l'altro metodo)
Ciao
Italo

 un numero intero č pari o dispari?
[spero non sia uno scherzo...]
Di solito si prende il resto della divisione per 2.
Se il resto č 1, il numero č disparti. Altrimenti č pari.
Il resto (o modulo), in C, si fa con il %.
esempio:
if ( N % 2 == 0)
   printf(" il numero %d č pari! ",N);
bye, debrando

un numero intero č pari o dispari?
N mod 2
se N e' pari ottieni 0, se N e' dispari ottieni 1.
Il mod e' normalmente disponibile nei linguaggi ad alto livello;
eventualmente lo puoi implementare come N-int(N/2)*2 dove int indica
la parte intera...
Ciao,
      ___
     (___
      ___)tefano.


<snip>
Non ho verificato, ma voglio *sperare* che un compilatore - se deve fare un salto in base al
risultato di una divisione per 2 - faccia un jump sul carry fuoriuscito dalla shift-right.
ovvero (supponendo che Numero sia a 32 bit).
MOV EAX, Numero
SHR AX
JC xxx
Ma forse spero troppo dai compilatori...
ormai ho capito che si sforzano solo ad appesantire la GUI invece di ottimizzare il codice.
:-(
comunque facendo la and si taglia sicuramente la testa al toro, anche se si occupa un
epsilon in piů dovendo mettere un parametro immediato.  :-)
bye, debrando


In generale se si vuol sapere se un numero N è divisibile per un
qualunque numero A si fa:
	if (N % A == 0) then 
	   printf(" il numero %d è divisibile per %d ",N,A);
Christian Salvaneschi
Casarza Ligure, Genova, Italy
e.mail: 
cr...@geocities.com
   web: 
http://www.geocities.com/SiliconValley/Lakes/5139