On 2013-11-26 21:31:55 +0000, bioinfornatics said:

On Tuesday, 26 November 2013 at 21:18:29 UTC, Shammah Chancellor wrote:
On 2013-11-26 21:00:56 +0000, bioinfornatics said:

On Tuesday, 26 November 2013 at 20:50:13 UTC, bioinfornatics wrote:
On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:
bioinfornatics:

I wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd

That works for small number but after i got an error about limit recursion

Instead of template recursion, have you tried regular code run at compile time?

http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious

Bye,
bearophile

Thanks i will take a look

this one seem to be interesting http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup

is like i do but use a table than me i used a recursive way. I go to try it :-)

I think you just have a bug in your template code not terminating. At most you should execute 4 times. I think there's a problem with casting down from byte to bool.

However, not user if LesserType is what you're after, but this works:

template log2(ulong x)
{
static if( x >> 8 )
{
enum log2 = log2!(x >> 8) + 8;
}
else static if( x >> 1)
{
enum log2 = log2!(x>>1) + 1;
} else
{
enum log2 = 1;
}
}

Thanks your way is much easier to write, works fine :-)

I would suggest turning it into a compile-time-function though as this will instantiate a large number of templates if you use is repetitively. Remember that templates are cached by DMD.

int log2(const ulong x)
{
  if( x >> 8 )
 {
   return log2(x >> 8) + 8;
 }
 else if( x >> 1)
 {
   return log2(x>>1) + 1;
 } else
 {
   return 1;
 }
}

void main()
{
 pragma(msg, log2(1UL<<63));
}

Reply via email to