這兩天在學習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;
}