原文
struct ReverseBitRange
{
enum bitsPerWord = size_t.sizeof * 8;
private
{
const(size_t)*bits;
size_t cur;
size_t idx;
size_t len;
}
@nogc nothrow pure:
this(const(size_t)* bitarr, size_t numBits) @system
{
bits = bitarr + (numBits - 1) / bitsPerWord;
len = numBits;
idx = numBits - 1;
if (len)
{
cur = *bits-- ^ (size_t(1) << idx);
popFront();
}
}
size_t front()
{
assert(!empty);
return idx;
}
bool empty() const
{
return idx < 0;
}
void popFront() @system
{
auto curbit = idx % bitsPerWord;
cur ^= size_t(1) << curbit;
if (!cur)
{
idx -= curbit;
while (!cur)
{
if ((idx -= bitsPerWord) >= len)
return;
cur = *bits--;
}
idx += bsr(cur);
}
else
{
idx -= curbit - bsr(cur);
}
}
}