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 @   zjh6  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示