OOP MyBitset非类型模板参数(类模板+输出及运算符重载)

题目描述

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;
}

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值