return0;
}
2. (10分)
二进制类
(1)——运算符重载
题目描述
将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。
在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。
因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。
另外有一个类型转换函数int(),用来将类类型向整型转换。
两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。
classbinary{//定义二进制类
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
friendbinaryoperator+(binary,binary);//重载“+”
friendbinaryoperator-(binary,binary);//重载“-”
operatorint();//类类型转换函数
voidprint();
};
主函数设计如下:
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<cout<cout<cout<return0;
}
输入描述
无
输出描述
略
输入样例
无
输出样例
0000000000001011
0000000000011010
0000000000000100
31
21
9
-1
我的代码:
方法一:
#include
usingnamespacestd;
classbinary
{
public:
binary(char*);
binary(int);
friendbinaryoperator+(constbinary&,constbinary&);
friendbinaryoperator-(constbinary&,constbinary&);
operatorint();
voidprint();
private:
charbits[16];
};
binary:
:
binary(char*num)
{
intlen1=strlen(num)-1;//字符串长度减一为最低位。
intlen2=15;
while(len1>=0&&len2>=0)
{
bits[len2--]=num[len1--];//逐位赋值
}
while(len2>=0)
{
bits[len2--]='0';//空高位值0
}
}
binary:
:
binary(intnum)
{
for(inti=15;i>=0;i--)
{
bits[i]=(num%2)+'0';//求余数
num>>=1;//向右移一位。
相当于整除2
}
}
binaryoperator+(constbinary&n1,constbinary&n2)
{
binaryn3=binary("0000");
intsum,num1=0,num2=0;
for(inti=0;i<=15;i++)
{
num1=(n1.bits[i]=='0'?
0:
1)+2*num1;
}
for(inti=0;i<=15;i++)
{
num2=(n2.bits[i]=='0'?
0:
1)+2*num2;
}
sum=num1+num2;
for(inti=15;i>=0;i--)
{
n3.bits[i]=(sum%2)+'0';
sum>>=1;
}
returnn3;
}
binaryoperator-(constbinary&n1,constbinary&n2)
{
binaryn3=binary("0000");
intcha,num1=0,num2=0;
for(inti=0;i<=15;i++)
{
num1=(n1.bits[i]=='0'?
0:
1)+2*num1;
}
for(inti=0;i<=15;i++)
{
num2=(n2.bits[i]=='0'?
0:
1)+2*num2;
}
cha=num1-num2;
for(inti=15;i>=0;i--)
{
n3.bits[i]=(cha%2)+'0';
cha>>=1;
}
returnn3;
}
binary:
:
operatorint()
{
intsum=0;
for(inti=0;i<=15;i++)
{
sum=2*sum+(bits[i]=='0'?
0:
1);
}
returnsum;
}
voidbinary:
:
print()
{
charstr[17];
strncpy(str,bits,16);
str[16]='\0';
cout<}
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<cout<cout<cout<return0;
}
方法二:
#include
#include
usingnamespacestd;
classbinary//定义二进制类
{
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
friendbinaryoperator+(binary,binary);//重载“+”
friendbinaryoperator-(binary,binary);//重载“-”
operatorint();//类类型转换函数
voidprint();
};
binary:
:
binary(char*num)
{
intisrc=strlen(num)-1;//字符串长度-1为最低位
intidest=15;
while(isrc>=0&&idest>=0)
{
bits[idest--]=(num[isrc--]=='0'?
'0':
'1');//逐位赋值
}
while(idest>=0)
{
bits[idest--]='0';//空高位值0
}
}
binary:
:
binary(intnum)
{
for(inti=15;i>=0;i--)
{
bits[i]=(num%2)+'0';//求余数
num>>=1;//移位,相当于整除2
}
}
binaryoperator+(binaryn1,binaryn2)
{
unsignedcarry=0;
unsignedvalue;
binaryres="0";
for(inti=15;i>=0;i--)
{
value=(n1.bits[i]=='0'?
0:
1)+(n2.bits[i]=='0'?
0:
1)+carry;
res.bits[i]=(value%2==0?
'0':
'1');
carry=value>>1;
}
returnres;
}
binaryoperator-(binaryn1,binaryn2)
{
unsignedborrow=0;
intvalue;
binaryres="0";
for(inti=15;i>=0;i--)
{
value=(n1.bits[i]=='0'?
0:
1)-(n2.bits[i]=='0'?
0:
1)+borrow;
res.bits[i]=(value==-1||value==1?
'1':
'0');
borrow=(value==-1||borrow!
=0&&(value==0||value==1)?
1:
0);
}
returnres;
}
binary:
:
operatorint()
{
unsignedvalue=0;
for(inti=0;i<=15;i++)
{
value=(value*2)+(bits[i]=='0'?
0:
1);
}
returnvalue;
}
voidbinary:
:
print()
{
charstr[17];
strncpy(str,bits,16);
str[16]='\0';
cout<}
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<cout<cout<cout<return0;
}
3. (10分)
二进制类
(2)——运算符重载
题目描述
在上一题的基础上,将+、-运算符定义为binary类的成员函数。
并且重载运算符~、&、|,分别将二进制数按位取反、数按位与及按位或。
主函数设计如下:
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
binaryn4=n1&n2;
binaryn5=n1|n2;
binaryn6=~n1;
n4.print();
n5.print();
n6.print();
return0;
}
输入描述
无
输出描述
略
输入样例
无
输出样例
0000000000001011
0000000000011010
0000000000000100
0000000000001010
0000000000011011
111111*********0
我的代码:
#include
usingnamespacestd;
classbinary
{
public:
binary(char*);
binary(int);
binaryoperator+(constbinary&);
binaryoperator-(constbinary&);
friendbinaryoperator~(binary&t1);
friendbinaryoperator&(binary&t1,binary&t2);
friendbinaryoperator|(binary&t1,binary&t2);
operatorint();
voidprint();
private:
charbits[16];
};
binary:
:
binary(char*num)
{
intlen1=strlen(num)-1;//字符串长度减一为最低位。
intlen2=15;
while(len1>=0&&len2>=0)
{
bits[len2--]=num[len1--];//逐位赋值
}
while(len2>=0)
{
bits[len2--]='0';//空高位值0
}
}
binary:
:
binary(intnum)
{
for(inti=15;i>=0;i--)
{
bits[i]=(num%2)+'0';//求余数
num>>=1;//向右移一位。
相当于整除2
}
}
binarybinary:
:
operator+(constbinary&n1)
{
binaryn3=binary("0000");
intsum,num=0,num1=0;
for(inti=0;i<=15;i++)
{
num=(bits[i]=='0'?
0:
1)+2*num;
}
for(inti=0;i<=15;i++)
{
num1=(n1.bits[i]=='0'?
0:
1)+2*num1;
}
sum=num1+num;
for(inti=15;i>=0;i--)
{
n3.bits[i]=(sum%2)+'0';
sum>>=1;
}
returnn3;
}
binarybinary:
:
operator-(constbinary&n1)
{
binaryn3=binary("0000");
intcha,num=0,num1=0;
for(inti=0;i<=15;i++)
{
num=(bits[i]=='0'?
0:
1)+2*num;
}
for(inti=0;i<=15;i++)
{
num1=(n1.bits[i]=='0'?
0:
1)+2*num1;
}
cha=num-num1;
for(inti=15;i>=0;i--)
{
n3.bits[i]=(cha%2)+'0';
cha>>=1;
}
returnn3;
}
binaryoperator~(binary&t1)
{
for(inti=0;i<=15;i++)
{
t1.bits[i]=(t1.bits[i]=='0'?
'1':
'0');
}
returnt1;
}
binaryoperator&(binary&t1,binary&t2)
{
binaryt3="0000";
intnum1=int(t1),num2=int(t2),num;
num=num1&num2;
for(inti=15;i>=0;i--)
{
t3.bits[i]=num%2+'0';
num>>=1;
}
returnt3;
}
binaryoperator|(binary&t1,binary&t2)
{
binaryt3="0000";
intnum1=int(t1),num2=int(t2),num;
num=num1|num2;
for(inti=15;i>=0;i--)
{
t3.bits[i]=num%2+'0';
num>>=1;
}
returnt3;
}
binary:
:
operatorint()
{
intsum=0;
for(inti=0;i<=15;i++)
{
sum=2*sum+(bits[i]=='0'?
0:
1);
}
returnsum;
}
voidbinary:
:
print()
{
charstr[17];
strncpy(str,bits,16);
str[16]='\0';
cout<}
intmain()
{