NYIST 412 Same binary weight使用bitset

这两天在学习STL,刚开始我以为bitset没有什么用,直到看到题目才知道大错特错,bitset也是很有用的容器。

先说一下按位与&运算符:同时为一,结果才为一,否则都为0 。

题目链接:点击打开链接    

先重新学习一下bitset位集合容器。

bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1.

bitset类的方法的介绍:

1、创建bitset对象:  bitset<10>b;  能容纳10个元素的对象b

                                      bitset<10>b(8); 将8化为二进制存到b中

2、b.any()    b中是否存在置为1的二进制位?

     b.none()   b中不存在置为1的二进制位吗?

       b.count();        b中置为1的二进制个数
         b.size() ;        b中二进制的个数
         b.test(1);       b中在1位置的二进制位是否为1
         b.set();          把b中所有二进制位都置为1
         b.reset();      把b中所有二进制位都置为0
         b.set(5);       把b中在5位置的二进制位置为1
         b.reset(5);   把b中在5位置的二进制位置为0
         b.flip();          把b中所有二进制位按位取反
         b.flip(5);       把在5位置的二进制位按位取反
         b.to_ulong();在b中同样的二进制位返回一个unsigned long值
         os<<b;        把b中的位集输出到os流

以下是这道题目AC的代码:

 
#include<bitset>
#include<iostream>
using namespace std;
int main()
{
        int i,j,n,ct;
        while(cin>>n)
        {
                i=0,ct=0;
                bitset<33>b;
                while(n)      //存为二进制
                {
                        if(n%2)
                            b.set(i);
                        n/=2;
                        i++;
                }
                for(j=0;j<i;j++) //找到为01的位置j
                {
                        if(b.test(j)&&b.test(j+1)==0)
                        {
                                b.flip(j);    //1和0互换位置,也就是两个数都取反
                                b.flip(j+1);
                                break;
                        }
                }
                for(i=0;i<j;i++) //计算在01之后有多少个1
                {
                        if(b.test(i))
                          ct++;
                }
                for(i=0;i<j;i++)//将01之后的数都置为0
                  b.reset(i);
                for(i=0;i<ct;i++)//将ct个1放在末尾
                 b.set(i);
                cout<<b.to_ulong()<<endl;//输出这个数
        }
        return 0;
}
        



                               



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值