题目描述
c++语言有一个bitset的类库,可以方便地管理一系列的bit位以及进行某些统计,如统计1的位数等,也可以用它来查看整数的2进制表示
现在给你一个整数,希望查看其16位、32位、64位的二进制表示,并对它进行逻辑移位操作并给出移位后的二进制表示
请你实现一个简单的MyBitset,可以通过模板参数指定bit的数量N,并可以在构造函数传入一个int整数num构造其N-bit表示,
如果N-bit不足以完整表示num,则只需表示其低N-bit即可,例如:0100 1101 用4-bit表示为 1101;
输入的num可能为负数,如:1101 (-3) 用8-bit表示应为 1111 1101 (符号拓展)
1. 定义MyBitset<N>模板类,可以通过MyBitset<N>(num)方式构造,
其中N为正整数常数,如16、32等等;num则为int型整数
为简化bit访问,可以每byte只存储一个bit
2. 重载 <<= 运算符实现"逻辑左移"
3. 重载 >>= 运算符实现"逻辑右移"
4. 为MyBitset<N>重载输出
注意:输出是从高位到低位依次输出,如:7的16位二进制输出应为:0000000000000111
移位操作时也需要注意bit的顺序(比如左移操作时可能要将bit数组右移)
输入
第1行:1个整数n,表示测试次数
以下n行:1个整数num <<或>>表示移位方向 移位数量(非负数)
输出
对于每个num,输出:
移位前的16bit表示
移位前的32bit表示
移位前的64bit表示
一个空行
移位后的16bit表示
移位后的32bit表示
移位后的64bit表示
一个空行
IO模式
本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。
输入样例1
4
-1 >> 8
27 << 20
2147483647 << 1
-2147483648 >> 1
输出样例1
1111111111111111\n
11111111111111111111111111111111\n
1111111111111111111111111111111111111111111111111111111111111111\n
\n
0000000011111111\n
00000000111111111111111111111111\n
0000000011111111111111111111111111111111111111111111111111111111\n
\n
0000000000011011\n
00000000000000000000000000011011\n
0000000000000000000000000000000000000000000000000000000000011011\n
\n
0000000000000000\n
00000001101100000000000000000000\n
0000000000000000000000000000000000000001101100000000000000000000\n
\n
1111111111111111\n
01111111111111111111111111111111\n
0000000000000000000000000000000001111111111111111111111111111111\n
\n
1111111111111110\n
11111111111111111111111111111110\n
0000000000000000000000000000000011111111111111111111111111111110\n
\n
0000000000000000\n
10000000000000000000000000000000\n
1111111111111111111111111111111110000000000000000000000000000000\n
\n
0000000000000000\n
01000000000000000000000000000000\n
0111111111111111111111111111111111000000000000000000000000000000\n
#include <iostream>
using namespace std;
//根据主函数代码完成以下填空
#include<bitset>
#include<sstream>
template<int N>
class MyBitset {
bitset<N> bits;
public:
MyBitset(int num) {
bits = bitset<N>(num & ((1 << N) - 1));
}
MyBitset<N>& operator <<=(int shift) {
bits <<= shift;
return *this;
}
MyBitset<N>& operator >>=(int shift) {
bits >>= shift;
return *this;
}
friend ostream& operator<<(ostream& os, const MyBitset<N>& set) {
for (int i = N - 1; i >= 0; i--) {
os << set.bits[i];
}
return os;
}
};
//主函数
int main()
{
int n, offset;
long num;
string mode;
cin >> n;
while (n--) {
cin >> num >> mode >> offset;
MyBitset<16> bit16(num);
MyBitset<32> bit32(num);
MyBitset<64> bit64(num);
auto f_printbits = [&]() { // c++11以上
cout << bit16 << endl
<< bit32 << endl
<< bit64 << endl
<< endl;
};
f_printbits();
if (mode == ">>") {
bit16 >>= offset;
bit32 >>= offset;
bit64 >>= offset;
}
else if (mode == "<<") {
bit16 <<= offset;
bit32 <<= offset;
bit64 <<= offset;
}
f_printbits();
} //end while
return 0;
}