[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;
}

[bitset用法]SDUT 2841 Bit Problem

时间: 2024-10-11 22:09:02

[bitset用法]SDUT 2841 Bit Problem的相关文章

sdut 2841 Bit Problem (水题)

题目 贴这个题是因为看题解有更简单的方法, 我做的时候是直接算的, 也很简单. 贴一下题解吧: 如果一个整数不等于 0,那么该整数的二进制表示中至少有一位是 1. 这个题结果可以直接输出 x - (x&(x-1)); 因为x-1 之后二进制下,就是最右边的1变成了0, 最右边的1的 右边所有的0变成了1, 不影响最左边. 我的代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4

Bitset 用法(STL)

std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组.下面看一个例子 [cpp] view plaincopy bitset<20> b1(5); cout<<"the set bits in bitset<5> b1(5) is:" << b1 <<endl; 结果是   the set bits in bitset<5> b1(5) is:000

bitset用法

转自:http://www.cppblog.com/ylfeng/archive/2010/03/26/110592.html 声明#include <bitset>using std::bitset; bitset的定义和初始化bitset<32> bitvec; //32位,全为0. 给出的长度值必须是常量表达式.正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象. 这条语句把bitvec定义为含有32个位的bitset对象.和vect

Bitset小结 (POJ2443 &amp; HDU4920)

学了下bitset用法,从网上找的一些bitset用法,并从中调出一些常用的用法. 构造函数bitset<n> b; b有n位,每位都为0.参数n可以为一个表达式.如bitset<5> b0;则"b0"为"00000"; bitset<n> b(unsigned long u); b有n位,并用u赋值;如果u超过n位,则顶端被截除如:bitset<5>b0(5);则"b0"为"00101&

一道题看bitset应用 --ZOJ 3642

题意:给n个文件,包括文件名和文件大小,然后给出k个关键词,查询包含该关键词的文件的大小总和.文件名为一些中括号括起的关键词的合集. 解法:可用bitset记录每一个关键词在哪些文件中出现,然后查询即可. bitset用法如下: bitset<SIZE> bs; bool is_set = bs.any(); //是否存在1 bool not_set = bs.none(); //是否全0 int cnt_one = bs.count(); bs[index] = 1; bs.flip(ind

bitset的使用方法

bitset用法 有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值.位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法.标准库提供了bitset类使得处理位集合更容易一些.要使用bitset类就必须要包含相关的头文件.在本书提供的例子中,假设都使用了std::bitset的using声明: #include<bitset> usingstd::bitset; bitset的定义和初始化 表3-6列出了bitset的构造函数.类似于vector,bits

bitset位图讲解

bitset可以用来处理位图问题,用位可以大大减少占用的空间内存,但是位图问题适合处理不重复的,在一定范围内的整数问题.用两个位图可以处理只出现一次问题 #include <bitset> bitset<N> bit;//初始化会默认都为0. bitset用法 bitset<N>最大支持到多少? 理论上只要内存够大就可以,跟数组一样 细节补充,暂时还用不到,当作了解 3.5.1  bitset的定义和初始化 表3-6列出了bitset的构造函数.类似于vector,bi

STL bitset

C++标准库:bitset 用法整理 std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位.下面看一个例子: #include<bitset> std::bitset<8> bs;//它是一个模板,传递的参数告诉编译器bs有8个位. 我们接着看上面的代码,通过上面两行的代码我们得到一个bitset的对象bs,bs可以装入8个位,我们可以

CF778B(round 402 div.2 E) Bitwise Formula

题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied their properties and invented a new game. Initially, Bob chooses integer m, bit depth of the game, which means that all numbers in the game will consis