I have the following power function which operates on integers and it works fine:
int ipow( int base, int exp )
{
int result = 1;
while( exp )
{
if ( exp & 1 )
{
result *= base;
}
exp >>= 1;
base *= base;
}
return result;
}
Now I'd like to have a version which allows exp > 32. So I use unsigned long long ints:
unsigned long long int ipow( int base, int exp )
{
unsigned long long int result = 1ULL;
while( exp )
{
if ( exp & 1 )
{
result *= (unsigned long long int)base;
}
exp >>= 1;
base *= base;
}
return result;
}
But this second version doesn't seem to work:
unsigned long long int x;
x = ipow( 2, 35 );
printf( "%llu\n", x );
this will output 0.
What's the problem with my unsigned long long int implementation?
Your base
variable is too small. Change it to unsigned long long int
, like the others, since it holds numbers greater than 2^32
.