2011-09-23 9 views
9

Esiste un modo per utilizzare il codice 2^di alimentazione senza utilizzare l'operatore math.pow o di moltiplicazione. Finora,2^potenza senza l'uso di matematica.pagamento e moltiplicazione

Ho pensato di utilizzare 2 contatori e aggiunte, ma i miei programmi non sembrano funzionare. Ecco il mio lavoro fino ad ora.

int counter=0; // k 
int userNumber=0; // p 
int power=0; 
int sum=0; 

cout << "Enter a non-negative number: "; 
cin >> userNumber; 


while (userNumber > counter) 
{ 
    power +=2; 
    counter++; 
    power++; 
} 

sum = power - 1; 
// post-condition: Sum = 2^p -1 
cout << "The output is " << sum << endl; 
return 0; 
+0

questo è un questione intervista? O compiti a casa? Il motivo per cui lo sto chiedendo, abbiamo esattamente quella domanda sul nostro colloquio di lavoro. C'è una risposta molto semplice basata su una funzione C++ relativamente oscura, ma se si suppone che tu debba indovinare da solo ... –

+0

@SevaAlekseyev: Oserei dire che devi trovare altre domande intervistate più profonde. ;-) –

+1

Sareste sorpresi dal numero di persone che ne sono afflitte. Inoltre, [ricorda il FizzBuzz] (http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html). –

risposta

-2
pow = 1; 
    while(userNumber > counter){ 
     pow = pow+pow; 
     counter++; 
    } 
+0

Mi sento così stupido ora; Questo ha molto senso! Grazie mille !! – Naman

+5

@Namen: Sembra che non ti siano piaciute le risposte a spostamento di bit. C'era una ragione per questo? – Mysticial

+5

Sembra più un tentativo di calcolare 2 * userNumber, non 2^userNumber. E poiché il potere è inizializzato a zero, questo genera sempre zero. – IronMensan

4

Verificare la funzione ldexp.

+0

'ldexp' è per numeri in virgola mobile, non ints! –

+1

@Chris Jester-Young As is math.pow(). Il problema sembra in realtà molto più interessante per FP rispetto a int (intendo per int che è davvero banale) – Voo

+1

Supponevo che si stesse generalizzando a virgola mobile, dato che math.pow è stato fornito come opzione. E perché il caso intero non è interessante. –

69

È possibile calcolare 2^n con manipolazione dei bit. Semplicemente fare:

1 << n; 

Questo funziona perché sinistra-shifting con numeri binari equivale a moltiplicare per 2.

+6

+1 per 2k, ora non dovrai più ottenere il permesso per le tue modifiche. :) – Mysticial

+0

Q.E.D: http://ideone.com/Tc7Cg – Johnsyweb