位图及习题

本文介绍了如何设计一个名为Bitset的类,用于高效地表示和操作整型中的位集。主要方法包括设置、修改位值、翻转所有位、检查全1或至少一位为1的状态以及获取位的数量和位的字符串表示。
摘要由CSDN通过智能技术生成

概念:一个int(整型)有32位,那么就可以表示0到31的数字,那个位置为1,就代表存在那个值。

2166. 设计位集 - 力扣(LeetCode)

class Bitset {
public:
    int* set;
    int ones ;
    int zeros ;
    //用 size 个位初始化 Bitset ,所有位都是 0 。
    Bitset(int size) {
        set = new int[size+31/32];
        ones = 0;
        zeros = size;
    }
    //将下标为 idx 的位上的值更新为 1 。如果值已经是 1 ,则不会发生任何改变。
    void fix(int idx) {
        int n = (1 << idx % 32);
        if ((idx&1)==0)
        {
            ones++;
            zeros--;
        }
        set[idx / 32]&=n;
    }
    //将下标为 idx 的位上的值更新为 0 。如果值已经是 0 ,则不会发生任何改变
    void unfix(int idx) {
        int n = (1 << idx % 32);
        if ((idx & 1) != 0)
        {
            ones--;
            zeros++;
        }
        set[idx / 32] &= ~(1 << idx % 32);
​
        //查看idx位上是否为0的另一种写法
        //(set[idx/32]>>(idx%32))&1==0
    }
    //翻转 Bitset 中每一位上的值。换句话说,所有值为 0 的位将会变成 1 ,反之亦然。
    void flip() {
        for (int i=0;i<sizeof(*set)/sizeof(int);i++)
        {
            set[i] ^= 0xFFFFFFF;
        }
        int tmp = ones;
        ones = zeros;
        zeros = tmp;
    }
    //检查 Bitset 中 每一位 的值是否都是 1 。如果满足此条件,返回 true ;否则,返回 false 。
    bool all() {
        return zeros == 0;
    }
    //检查 Bitset 中 是否 至少一位 的值是 1 。如果满足此条件,返回 true ;否则,返回 false 
    bool one() {
        return ones > 0;
    }
    //返回 Bitset 中值为 1 的位的 总数 
    int count() {
        return ones;
    }
    //返回 Bitset 的当前组成情况。注意,在结果字符串中,第 i 个下标处的字符应该与 Bitset 中的第 i 位一致。
    //把每一位向右运动到第一位,然后&1,为0就证明这位就是0,加到str中。
    string toString() {
        string str;
        for (int i=0;i<sizeof(*set)/sizeof(int);i++)
        {
            for (int j=0;i<32;j++)
            {
                if ((set[i]>>i)&1==0)
                {
                    str.append("0");
                }
                else {
                    str.append("1");
                }
            }
        }
        return str;
    }
​
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值