Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: "Using de Bruijn Sequences to Index a 1 in a Computer Word"

Author: Ricardo Gibert

Date: 09:14:22 02/09/02

Go up one level in this thread


On February 09, 2002 at 03:07:47, Dann Corbit wrote:

>On February 08, 2002 at 17:17:26, Oliver Roese wrote:
>
>>Hi!
>>
>>http://citeseer.nj.nec.com/338945.html
>>Hope you find it interesting.
>
>Unless I've screwed it up a bit, it doesn't quite work right at the endpoints.

If you take the trouble of understanding the *idea* of the algorithm, you would
realize that the idea is sound even if a particular incarnation in code may not
be.

>
>#define debruijn32 0x077CB531UL
>/* debruijn32 = 0000 0111 0111 1100 1011 0101 0011 0001 */
>/* table to convert debruijn index to standard index */
>static unsigned int      index32[32];
>/* routine to initialize index32 */
>void            setup(void)
>{
>    unsigned        i;
>    for (i = 0U; i < 32U; i++)
>        index32[(debruijn32 << i) >> 27U] = i;
>}
>/* compute index of rightmost 1 */
>int             rightmost_index(unsigned long b)
>{
>    b &= -b;
>    b *= debruijn32;
>    b >>= 27U;
>    return index32[b];
>}
>#ifdef UNIT_TEST
>#include <stdio.h>
>#include <limits.h>
>int             main(void)
>{
>    unsigned        i;
>    int             j;
>    setup();
>    j = rightmost_index(0);
>    printf("right bit of %u is %d\n", 0, j);
>    for (i = 1U; i < UINT_MAX && i > 0; i <<= 1U) {
>        int             j = rightmost_index(i);
>        printf("right bit of %u is %d\n", i, j);
>    }
>    j = rightmost_index(UINT_MAX);
>    printf("right bit of %u is %d\n", UINT_MAX, j);
>    return 0;
>}
>#endif



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.