Re: Off topic 'C' question

From: Mike Mascari <mascarm(at)mascari(dot)com>
To: Alfred Perlstein <bright(at)wintelcom(dot)net>
Cc: pgsql-hackers(at)postgresql(dot)org, hstenger(at)ieee(dot)org
Subject: Re: Off topic 'C' question
Date: 2000-07-30 05:05:51
Message-ID: 3983B7AF.709E30C5@mascari.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Alfred Perlstein wrote:
>
> * Mike Mascari <mascarm(at)mascari(dot)com> [000729 18:40] wrote:
> > I have a quick question. What is the quickest way to determine
> > the next highest power of two which is greater than a given
> > integer in 'C'. For example, given the number 7, I would like to
> > return 8. Given the number 13, I would like to return 16, etc. Is
> > there a gem to do this without shifting a bit value from 1 left
> > up to a maximum of 32 (or 64) iterations?
> >
> > Thanks for any info,
>
> Think "binary search".
>
> -Alfred

Yeah. Start with 2^16, check if larger. If so, check 2^8, etc. In
Graphics Gems II, there's an algorithm by Ken Shoemake for
finding the lowest 1-bit set. You take the bit-wise AND of the
word and its negative -- that easy. I was hoping something
similar existed for finding the highest bit set. If so, I could
just shift the result left one. If not, if there's a way to flip
the bits in an unsigned integer without barrel shifting, then all
I would have to do is:

flip
take bit-wise AND with negative
flip
shift left 1

The binary search, is of course, better then brute force, but can
be worse than linear for low values. For example, a search for
2^5 would yield:

2^16
2^0
2^8
2^4
2^6
2^5

or 6 iterations instead of 5, plus the actual shifting of the
search value. I guess I was hoping for some "bit-magic" out
there.

Cheers,

Mike Mascari

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Denis Perchine 2000-07-30 08:18:26 Problem with updating system indices.
Previous Message Alfred Perlstein 2000-07-30 03:26:22 Re: Off topic 'C' question