Tutti i programmi seguenti vanno scritti usando solo istruzioni di assegnamento e di ingresso/uscita (niente if, for, while, ecc.). Inoltre non si devono utilizzare operatori di confronto (<, <=, >, >=, !=, ==). Infine non si devono utilizzare operatori logici (!, &&, ||). Inoltre per semplicità, in tutti gli esercizi si assume che i valori immessi dall'utente non portino mai ad effettuare traslazioni di un numero di posizioni maggiore o uguale del numero di bit su cui sono rappresentati i vettori di bit. Indicazioni generali: -> con la notazione 2^i si intende "2 elevato alla i". -> ricordare che le cifre nella codifica binaria (come in qualsiasi altra codifica), si contano a partire da quella meno significativa (quella piu' a destra). In particolare tale cifra ha ordine zero, quella immediatamente piu' a sinistra e' di ordine 1, e cosi' via. ----------------- ES. 1 Traccia: Scrivere un programma che legga da tastiera un numero naturale n, moltiplichi il numero per 2 senza utilizzare l'operatore di moltiplicazione e stampi il risultato sullo schermo. Trascurare eventuali problemi di overflow. Un possibile output e' il seguente: Immettere il numero n: 3 n * 2 = 6 Soluzione: #include using namespace std ; int main() { unsigned int n ; cout<<"Immettere il numero n: " ; cin>>n ; cout<<"n * 2 = "<<(n<<1)< using namespace std ; int main() { unsigned int n ; cout<<"Immettere il numero n: " ; cin>>n ; cout<<"Risultato: "<<(n&1)< using namespace std ; int main() { unsigned int n, i ; cout<<"Immettere il numero n: " ; cin>>n ; cout<<"Immettere il numero i: " ; cin>>i ; cout<>n ; cout<<"Immettere il numero i: " ; cin>>i ; cout<>i ; cout<<"Immettere il numero j: " ; cin>>j ; unsigned int risultato ; risultato = i >> (dimensioni - j) ; cout<<"Risultato: "< Per j=0 o j > 31, vale il commento fatto per l'esercizio precedente. Soluzione: #include using namespace std ; int main() { unsigned int i, j ; unsigned int dimensioni = 8*sizeof(unsigned int) ; cout<<"Immettere il numero i: " ; cin>>i ; cout<<"Immettere il numero j: " ; cin>>j ; unsigned int risultato ; risultato = i << (dimensioni - j) ; cout<<"Risultato: "< Sfruttando le soluzioni utilizzate nei due programmi precedenti, si possono realizzare questo ed il programma ancora successivo. ES. 7 Traccia: Scrivere un programma che legge da tastiera due numeri naturali k e j, e ruota a destra di j posizioni la rappresentazione binaria del numero k. -> La rotazione a destra di j posizioni di una configurazione di bit, si comporta come la traslazione (shift) a destra di j posizioni, eccetto il fatto che, i j bit meno significativi di tale configurazione divengono i j bit piu' significativi della nuova configurazione (mentre, nel caso della traslazione i j bit meno significativi sarebbero stati buttati via). -> Attenzione al fatto che, se si immette j > 31, l'implementazione di questo tipo di programma potrebbe cadere nel problema della traslazione di un numero di posizioni maggiore di quelle contenute nella rappresentazione di un numero naturale. Come gia' detto, supponiamo che non siano mai immessi valori che portano a tale effetto. Notare che, in questo esercizio, dobbiamo scrivere il programma in maniera tale che funzioni bene nel caso j=0. Un possibile output su schermo e' il seguente: Rotazione a destra: Immettere il numero k: 3 Immettere il numero j: 1 Risultato: 2147483649 (2^31 + 1) Soluzione: #include using namespace std ; int main() { unsigned int k, j ; unsigned int dimensioni = 8*sizeof(unsigned int) ; cout<<"Immettere il numero k: " ; cin>>k ; cout<<"Immettere il numero j: " ; cin>>j ; unsigned int parte_bassa = k >> j ; // nel seguente assegnamento, applico l'operatore resto (%) per // garantire che l'operatore di // traslazione funzioni anche nel caso in cui j=0 unsigned int parte_alta = k << ((dimensioni - j) % dimensioni) ; unsigned int risultato = parte_alta | parte_bassa ; cout<<"Risultato: "< La rotazione a sinistra di j posizioni di una configurazione di bit si comporta come la traslazione (shift) a sinistra di j posizioni, eccetto il fatto che, i j bit piu' significativi di tale configurazione divengono i j bit meno significativi della nuova configurazione (mentre, nel caso della traslazione i j bit piu' significativi sarebbero stati buttati via). -> Attenzione sempre al caso j > 31 e notare che anche in questo esercizio, dobbiamo scrivere il programma in maniera tale che funzioni bene nel caso j=0. Un possibile output su schermo e' il seguente: Rotazione a sinistra: Immettere il numero k: 2147483649 (2^31 + 1) Immettere il numero j: 1 Risultato: 3 Soluzione: #include using namespace std ; int main() { unsigned int k, j ; unsigned int dimensioni = 8*sizeof(unsigned int) ; cout<<"Rotazione a sinistra:\n" ; cout<<"Immettere il numero k: " ; cin>>k ; cout<<"Immettere il numero j: " ; cin>>j ; unsigned int parte_alta = k << j ; // nel seguente assegnamento, applico l'operatore resto (%) per // garantire che l'operatore di // traslazione funzioni anche nel caso in cui j=0 unsigned int parte_bassa = k >> ((dimensioni - j) % dimensioni) ; unsigned int risultato = parte_alta | parte_bassa ; cout<<"Risultato: "<=n, e stampi il risultato sullo schermo. (ovviamente, se n e' dispari i sara' uguale ad n, mentre, se n e' pari, i sara' uguale a n+1) Suggerimento: lavorare sulla configurazione di bit che rappresenta n. Un possibile output su schermo e' il seguente: Immettere il numero n: 4 Risultato: 5 Soluzione: #include using namespace std ; int main() { unsigned int n ; cout<<"Immettere il numero n: " ; cin>>n ; cout<<"Risultato: "<<(n|1)< using namespace std ; int main() { unsigned int n ; cout<<"Immettere il numero n: " ; cin>>n ; cout<<"Risultato: "<<(n&(~1))<