Computer Chess Club Archives


Search

Terms

Messages

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

Author: Heiner Marxen

Date: 08:56:20 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.
>
>#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

From the above code I get:

right bit of 0 is 0
right bit of 1 is 0
right bit of 2 is 1
right bit of 4 is 2
right bit of 8 is 3
right bit of 16 is 4
right bit of 32 is 5
right bit of 64 is 6
right bit of 128 is 7
right bit of 256 is 8
right bit of 512 is 9
right bit of 1024 is 10
right bit of 2048 is 11
right bit of 4096 is 12
right bit of 8192 is 13
right bit of 16384 is 14
right bit of 32768 is 15
right bit of 65536 is 16
right bit of 131072 is 17
right bit of 262144 is 18
right bit of 524288 is 19
right bit of 1048576 is 20
right bit of 2097152 is 21
right bit of 4194304 is 22
right bit of 8388608 is 23
right bit of 16777216 is 24
right bit of 33554432 is 25
right bit of 67108864 is 26
right bit of 134217728 is 27
right bit of 268435456 is 28
right bit of 536870912 is 29
right bit of 1073741824 is 30
right bit of 2147483648 is 31
right bit of 4294967295 is 0

which appears to be perfect IMO.
The last number (UINT_MAX) has the low bit set, so 0 is ok.

What exactly don't you like, Dann?

Cheers,
Heiner



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.