ОК, это может показаться немного сложным, но это то, что я пытаюсь сделать:
- Возьмите, например.
10101010101
- И верните
{ 0, 2, 4, 6, 8, 10 }
- массив со всеми позициями битов, которые установлены
Это мой код:
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;
}
И код, безусловно, работает.
Моя точка:
- Есть ли какая-то более быстрая реализация, которую вы имеете в виду?
- Вы заметили что-нибудь, что можно было бы оптимизировать? Если да, то что?
Советы:
-
UINT
- это typedefunsigned int
-
U64
- это typedefunsigned long long
- Оба метода:
static inline
.