Coding Problem
題目大意:給你一個字符串,每個字母的ASCII二級制顛倒過來組成一個01數組。
然後這個數組每六位組成一個數字的ASCII輸出
一道模擬題,使用C++中的bitset類型會簡單的很多
那麼正好來學習一下bitset的用法:
bitset
此處參考了這份博客:https://www.cnblogs.com/magisk/p/8809922.html
bitset大概就是一個二進制數組,每個位置只佔1bit,想一下狀壓dp?
bitset的原理大概是將很多數壓成一個,從而節省空間和時間(暴力出奇跡)
構造
構造時可以直接指定大小,也可以使用string和字符串數組來進行構造
需要注意的是,在使用字符串構造時,字符串中只能包含01,否則會拋出異常
bitset<4> bitset1; //無參構造,長度爲4,默認每一位爲0
bitset<8> bitset2(12); //長度爲8,二進制保存,前面用0補充
string s = "100101";
bitset<10> bitset3(s); //長度爲10,前面用0補充
char s2[] = "10101";
bitset<13> bitset4(s2); //長度爲13,前面用0補充
cout << bitset1 << endl; //0000
cout << bitset2 << endl; //00001100
cout << bitset3 << endl; //0000100101
cout << bitset4 << endl; //0000000010101
性質
它支持所有的位運算操作:^
&
|
>>
等
bitset的函數
bit.size() 返回大小(位數)
bit.count() 返回1的個數
bit.any() 返回是否有1
bit.none() 返回是否沒有1
bit.set() 全都變成1
bit.set(p) 將第p + 1位變成1(bitset是從第0位開始的!)
bit.set(p, x) 將第p + 1位變成x
bit.reset() 全都變成0
bit.reset(p) 將第p + 1位變成0
bit.flip() 全都取反
bit.flip(p) 將第p + 1位取反
bit.to_ulong() 返回它轉換爲unsigned long的結果,如果超出範圍則報錯
bit.to_ullong() 返回它轉換爲unsigned long long的結果,如果超出範圍則報錯
bit.to_string() 返回它轉換爲string的結果
題解
需要注意的坑點是這道題不能有換行符,行尾有空格
代碼如下
#include <bits/stdc++.h>
using namespace std;
string change(char c)
{
bitset<8> b((int)c);
stringstream str;
string s;
str << b;
str >> s;
reverse(s.begin(), s.end());
return s;
}
int main(void)
{
string s;
cin >> s;
for (int i = 0; i < s.size(); i+= 3) {
string ts = change(s[i]) + change(s[i + 1]) + change(s[i + 2]);
for (int j = 0; j < ts.size(); j+= 6) {
bitset<6> B(ts, j, 6);
printf("%d ", B);
}
}
return 0;
}