Re: C macro to find the next power of 2 ?

From: Attilio Rao <attilio_at_freebsd.org>
Date: Wed, 7 Feb 2007 11:55:27 +0100
2007/2/7, Luigi Rizzo <rizzo_at_icir.org>:
> On Wed, Feb 07, 2007 at 11:25:49AM +0100, Stefan Bethke wrote:
> > On Wed, February 7, 2007 09:41, Luigi Rizzo wrote:
> > > My problem is that some hardware wants data structures aligned to
> > > the next power of 2 with respect to their size, and the code
> > > in question (the ehci driver in case you care) has hardwired
> > > constants for this, and possibly wrong ones.
> > >
> > > It would be nice if one could write
> > >
> > >     struct foo_desc {
> > >             ...
> > >     };
> > >
> > >     #define FOO_ALIGN next_power_of_2(sizeof(struct foo_desc))
> > >
> > > instead of having to count fields and make guesses on the size
> > > of pointers and so on.
> >
> > _Hacker's Delight_ contains many cool tricks, including multiple solutions
> > for this, IIRC.  I'll have a look tonight when I'm back home.
>
> funny it looks like the same code that i posted,
> except that mine is functional and theirs procedural:
>
> my version:
>
>         #define b2(x)   (   (x) | (   (x) >> 1) )
>         #define b4(x)   ( b2(x) | ( b2(x) >> 2) )
>         #define b8(x)   ( b4(x) | ( b4(x) >> 4) )
>         #define b16(x)  ( b8(x) | ( b8(x) >> 8) )
>         #define b32(x)  (b16(x) | (b16(x) >>16) )
>         #define next_power_of_2(x)      (b32(x-1) + 1)
>
> Hacker's Delight version
>
>         unsigned clp2(unsigned x) {
>            x = x - 1;
>            x = x | (x >> 1);
>            x = x | (x >> 2);
>            x = x | (x >> 4);
>            x = x | (x >> 8);
>            x = x | (x >>16);
>            return x + 1;
>         }

You cannot use this unless you don't rewrite as a preprocessing stub.

Attilio


-- 
Peace can only be achieved by understanding - A. Einstein
Received on Wed Feb 07 2007 - 09:55:38 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:05 UTC