2013-06-08 9 views
6

Devo scrivere una funzione che calcola il floor della base di log 16 di un unsigned int passato. Ci sono delle restrizioni su quali operatori e quali costanti possiamo utilizzare, e possiamo usare solo i loop for.Per il ciclo senza la seconda condizione, ad esempio il controllo booleano?

Per chiarezza, non è possibile utilizzare alcuna istruzione condizionale (se, altrimenti, passare ...). Il prototipo di funzione è:

int floor_log16(unsigned int x); 

operatori ammessi: ++--=&|~^<<!>>

costanti ammessi: 1234816

ho scritto una versione del programma come segue:

int floor_log16(unsigned int x) { 
    int index=1; 
    int count=(1!=1); 

    count--; 

    for(; index<=x; index<<=4) { 
     count++; 
    } 

    return count; 
} 

che sembra funzionare come desiderato. Tuttavia, mi sono reso conto che sulla base delle funzioni successive e della descrizione delle funzionalità necessarie che dobbiamo scrivere, ho notato che sotto "operatori consentiti" a volte erano elencati > e <.

Ne deduco questo implica che in quanto per la funzione floor_log16 di cui sopra, c'è stato non esplicitamente detto di usare > o <, posso solo supporre che la soluzione postato sopra non saranno accettate.

Questo mi lascia piuttosto confuso perché non capisco come si possa avere un ciclo for senza un controllo booleano?

Non è l'intera idea di un ciclo per iterare mentre una condizione è soddisfatta?

+0

Per motivi di interesse, è possibile creare un'istruzione if utilizzando un ciclo for, quindi la restrizione dell'istruzione if è piuttosto banale (analogamente per 'else') - istruzione' if (condition); '=' for (; condizione;) {dichiarazione; pausa;} ', ma non credo che tu abbia intenzione di farlo. – Dukeling

+0

Forse qualcosa come 'for (; x; x >> 4)'? che si fermerà quando 'x == 0' –

+0

" Non capisco come si possa avere un ciclo for senza un controllo booleano? " - Il ciclo for stesso esegue un controllo booleano ... o continua o termina in base al valore di un'espressione. "Non è tutta l'idea di un ciclo per iterare mentre una condizione è soddisfatta?" - No, è per iterare mentre l'espressione è diversa da zero. Questo sarebbe chiaro se dovessi effettivamente leggere la documentazione piuttosto che filosofare su "l'intera idea" delle cose. Considera che gli studenti con le giuste capacità intellettuali otterranno voti migliori e otterranno il lavoro. –

risposta

5

Beh, prima di tutto, for -loop senza il controllo booleano va perfettamente bene. Ad esempio,

for (;;) 

è un modo comune di scrivere

while (true) 

In secondo luogo, avere un -loop for con le altre parti, ma senza controllo booleano è ancora utile come si può uscire con return o break.

E l'ultima cosa. Esistono molti modi per ottenere un valore booleano senza utilizzare < e >. Ad esempio, puoi semplicemente utilizzare i per verificare che i != 0 e così via.

Ad esempio, se si desidera verificare che a < b è possibile verificare per (a - b) < 0 invece. Implementare l'addizione (e quindi la sottrazione) con operatori bit a bit è una domanda di intervista ben nota (dovresti provare a farlo tu stesso, è divertente) e controllare che il tuo int sia negativo sia facile come guardare il suo bit più significativo.

+0

Dopo aver notato che altri stanno rispondendo alla domanda in termini di compito esatto, voglio solo sottolineare che ciò che ho detto nell'ultimo paragrafo è solo una dimostrazione generale della potenza degli operatori bit a bit. È troppo complicato per il tuo particolare compito e può essere risolto in modo più semplice. – kirelagin

2

Non mi piace rovinare il tuo compito ma considerare la condizione for come "confronto a 0". Questo non richiede alcun operatore esplicito.Uno dei modi possibili per farlo è qualcosa di simile:

// This cycle will end as soon as index is 0. 
for (;index; index = (index >> 4)) 
{ 
    // ... 
} 
0

Se XOR qualsiasi firmato con se stesso, diventa 0. Quindi int count=(1!=1); potrebbe essere modificato a int count = 1^1.

Per quanto riguarda la condizione del loop, l'idea di Roman di paragonare a 0 sembra il modo più naturale per procedere.

Problemi correlati