来源:点击打开链接
可以模拟过,不过练习这个题的目的是学习stl中的bitset,一个神奇的二进制容器.
和vector/MAP等容器一样,bitset具备stl库函数的几乎所有特性,同时加入了一些自己的东西,对二进制处理十分便利,尤其是在找零和找一的方面.
ps:遍历的话,bitset默认是从后往前遍历的.所以不要自己再倒过来了.
一些库函数及用法的实例:
典型的bitset初始化示例
- bitset<16> bi(0xffff);:初始化为unsigned值
- bitset<32> bi(str);:用string对象初始化,翻转赋值
- bitset<4> bi(str, 5, 4);:截取string对象从下标5开始的4个字符,翻转赋值
- bitset<4> bi(str, str.size() - 4);:截取string对象的最后4个字符,翻转赋值
bitset对象常用操作
- bi[3]:访问指定下标的二进制位
- bi.size():返回bitset的位数
- bi.count():返回bitset中值为1的位数
- bi.any():是否存在值为1的位
- bi.none():是否不存在值为1的位,与any()相反
- bi.test(3):指定下标的值是否为1
- bi.set():将所有二进制位置1
- bi.set(3):将指定下标的值置1
- bi.reset():将所有二进制位置0
- bi.reset(3):将指定下标的值置0
- bi.flip():将所有二进制位翻转
- bi.flip(3):将指定下标的值翻转
- 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