首页 > 代码库 > [bitset用法]SDUT 2841 Bit Problem

[bitset用法]SDUT 2841 Bit Problem

来源:点击打开链接

可以模拟过,不过练习这个题的目的是学习stl中的bitset,一个神奇的二进制容器.

和vector/MAP等容器一样,bitset具备stl库函数的几乎所有特性,同时加入了一些自己的东西,对二进制处理十分便利,尤其是在找零和找一的方面.

ps:遍历的话,bitset默认是从后往前遍历的.所以不要自己再倒过来了.

一些库函数及用法的实例:

典型的bitset初始化示例

  1. bitset<16> bi(0xffff);:初始化为unsigned
  2. bitset<32> bi(str);:用string对象初始化,翻转赋值
  3. bitset<4> bi(str, 5, 4);:截取string对象从下标5开始的4个字符,翻转赋值
  4. bitset<4> bi(str, str.size() - 4);:截取string对象的最后4个字符,翻转赋值

bitset对象常用操作

  1. bi[3]:访问指定下标的二进制位
  2. bi.size():返回bitset的位数
  3. bi.count():返回bitset中值为1的位数
  4. bi.any():是否存在值为1的位
  5. bi.none():是否不存在值为1的位,与any()相反
  6. bi.test(3):指定下标的值是否为1
  7. bi.set():将所有二进制位置1
  8. bi.set(3):将指定下标的值置1
  9. bi.reset():将所有二进制位置0
  10. bi.reset(3):将指定下标的值置0
  11. bi.flip():将所有二进制位翻转
  12. bi.flip(3):将指定下标的值翻转
  13. bi.to_ulong():使用bi中同样的二进制位,返回一个unsigned long.
代码如下:

#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
#include <bitset>
using namespace std;
int main()
{
    int testcase;
    int counter=1;
    while(cin>>testcase)
    {
        if(testcase==0)
            break;
        cout<<"Answer to case"<<counter++<<":"<<endl;
        for(int i=1; i<=testcase; i++)
        {
            int tar;
            int lastdigit;
            int conv;
            cin>>tar;
            bitset<32> pack(tar);
            //cout<<pack<<endl;
            for(int i=0; i<pack.size(); i++)
            {
                if(pack[i]==1)
                {
                    pack[i]=0;
                    break;
                }

            }
            //cout<<pack<<endl;
            int res=pack.to_ulong();

            cout<<tar-pack.to_ulong()<<endl;

        }

        cout<<endl;

    }
    return 0;
}