【问题描述】
在上一题的基础上,将 + 、 - 运算符定义为binary类的成员函数。
并且重载运算符 ~ 、 & 、 | ,分别表示将二进制数按位取反、按位与及按位或。
主函数设计如下,请勿修改:
int main(){
binary n1="1011";
binary n2=int(n1)+15;
binary n3=n1-binary(7);
cout<<n1<<endl;
cout<<n2<<endl;
cout<<n3<<endl;
binary n4=n1&n2;
binary n5=n1|n2;
binary n6=~n1;
cout<<n4<<endl;
cout<<n5<<endl;
cout<<n6<<endl;
return 0;
}
【样例输出】
0000000000001011
0000000000011010
0000000000000100
0000000000001010
0000000000011011
1111111111110100
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
class binary //定义二进制类
{
private:
char bits[16]; //二进制字模数组
public:
binary(char *); //字符串参数构造函数
binary(int); //整型参数构造函数
binary operator +(binary); //重载“+”,成员函数
binary operator -(binary); //重载“-”,成员函数
operator int(); //类类型转换函数(将类类型向整型转换,即将二进制形式的类对象转换为整形数)
friend ostream & operator <<(ostream &out, binary &b);//重载“<<”,以二进制形式输出
void print();//以整型形式输出
//重载运算符 ~ 、 & 、 |
binary & operator~();//将二进制数按位取反,成员函数
binary operator&(binary n);//将二进制数按位与,成员函数
binary operator|(binary n);//将二进制数按位或,成员函数
};
binary::binary(char * str) //字符串参数构造函数
{
//把bits数组全部元素初始化为0
for(int i=0;i<16;++i)
bits[i] = '0';
int len = strlen(str);
for(int i=len-1,j=15;i>=0;--i,--j)//i的初始化是len-1 不然最后数组只存储了15个字符而不是16个
bits[j] = str[i];
}
binary::binary(int x) //整型参数构造函数
{
//把bits数组全部元素初始化为0
for(int i=0;i<16;++i)
bits[i] = '0';
int i = 15;
while( x>0 )
{
bits[i--] = x%2+'0';//注意bits[i]是字符数组,要类型转换
x /= 2;
}
}
binary binary::operator +(binary t) //重载“+”,成员函数
{
binary tt = (int)(*this) + (int)t;
return tt;
}
binary binary::operator -(binary t) //重载“-”,成员函数
{
binary tt = fabs( (int)(*this) - (int)t );
return tt;
}
binary::operator int() //类类型转换函数(将类类型向整型转换,即将二进制形式的类对象转换为整形数)
{
int num = 0;
for(int i=15,j=0;i>=0;--i,++j)
num += (bits[i]-'0') * pow(2,j);//最有毒的地方,别忘记bits[i]数组中存储的是字符而不是数字,要减'0'
return num;
}
ostream & operator <<(ostream &out, binary &b)//重载“<<”,以二进制形式输出
{
for(int i=0;i<16;++i)
out << b.bits[i];
return out;
}
void binary::print()//以整型形式输出
{
cout << (int)*this << endl;
}
//重载运算符 ~ 、 & 、 |
binary & binary::operator~()//将二进制数按位取反,成员函数
{
for(int i=0;i<16;++i)
if( bits[i]=='0' ) bits[i]='1';
else bits[i]='0';
return (*this);
}
binary binary::operator&(binary n)//将二进制数按位与,成员函数
{
binary tt(0);
for(int i=0;i<16;++i)
if( bits[i]=='1' && n.bits[i]=='1' ) tt.bits[i]='1';
else tt.bits[i]='0';
return tt;
}
binary binary::operator|(binary n)//将二进制数按位或,成员函数
{
binary tt(0);
for(int i=0;i<16;++i)
if( bits[i]=='0' && n.bits[i]=='0' ) tt.bits[i]='0';
else tt.bits[i]='1';
return tt;
}
int main()
{
binary n1="1011";
binary n2=int(n1)+15;
binary n3=n1-binary(7);
cout<<n1<<endl;
cout<<n2<<endl;
cout<<n3<<endl;
binary n4=n1&n2;
binary n5=n1|n2;
binary n6=~n1;
cout<<n4<<endl;
cout<<n5<<endl;
cout<<n6<<endl;
return 0;
}