Obtener una matriz de las posiciones de bits dentro de un entero de 64 bits

Está bien, puede sonar un poco complicado, pero esto es lo que estoy tratando de hacer:

Tomar por ejemplo10101010101Y volver{ 0, 2, 4, 6, 8, 10 } - una matriz con todas las posiciones de bits que se establecen

Este es mi código:

UINT DQBitboard::firstBit(U64 bitboard)
{
    static const int index64[64] = {
    63,  0, 58,  1, 59, 47, 53,  2,
    60, 39, 48, 27, 54, 33, 42,  3,
    61, 51, 37, 40, 49, 18, 28, 20,
    55, 30, 34, 11, 43, 14, 22,  4,
    62, 57, 46, 52, 38, 26, 32, 41,
    50, 36, 17, 19, 29, 10, 13, 21,
    56, 45, 25, 31, 35, 16,  9, 12,
    44, 24, 15,  8, 23,  7,  6,  5  };

    static const U64 debruijn64 = 0x07EDD5E59A4E28C2ULL;

    #pragma warning (disable: 4146)
    return index64[((bitboard & -bitboard) * debruijn64) >> 58];  
}

vector<UINT> DQBitboard::bits(U64 bitboard)
{
    vector<UINT> res;

    while (bitboard)
    {
        UINT first = DQBitboard::firstBit(bitboard);
        res.push_back(first);

        bitboard &= ~(1ULL<<first);
    }

    return res;
}

Y el código seguramentefunciona.

Mi punto es :

¿Hay alguna implementación más rápida que tengas en mente?¿Te das cuenta de algo que podría ser optimizado? ¿Entonces qué?

Consejos:

UINT es un typedef deunsigned intU64 es un typedef deunsigned long longAmbos metodos sonstatic inline.

Respuestas a la pregunta(8)

Su respuesta a la pregunta