d的双向位区间

原文

struct ReverseBitRange
{
    /// 每个size_t中字节数
    enum bitsPerWord = size_t.sizeof * 8;

    private
    {
        const(size_t)*bits;//指向下一个待检查字节
        size_t cur; // 需要允许使用bsf搜索位
        size_t idx; // 当前设置位的索引
        size_t len; // 位集中的位数
    }
    @nogc nothrow pure:

    /**
     构造`BitRange`参数`:*bitarr=`要迭代的位数组`*numBits=`给定位数组中有效位的总数
     */
    this(const(size_t)* bitarr, size_t numBits) @system
    {
        bits = bitarr + (numBits - 1) / bitsPerWord;
        len = numBits;
        idx = numBits - 1;
        if (len)
        {
            // 第1个位
            cur = *bits-- ^ (size_t(1) << idx);
            popFront();
        }
    }

    /// 区间函数
    size_t front()
    {
        assert(!empty);
        return idx;
    }

    /// ditto
    bool empty() const
    {
        return idx < 0;
    }

    /// ditto
    void popFront() @system
    {
        // 清理当前位
        auto curbit = idx % bitsPerWord;
        cur ^= size_t(1) << curbit;
        if (!cur)
        {
            // 用设置位找下个size_t
            idx -= curbit;
            while (!cur)
            {
                if ((idx -= bitsPerWord) >= len)//警告,依赖size_t溢出
                    return;//空
                cur = *bits--;
            }
            idx += bsr(cur);
        }
        else
        {
            idx -= curbit - bsr(cur);
        }
    }
}
posted @ 2022-08-27 10:16  zjh6  阅读(15)  评论(0)    收藏  举报  来源