二进制类(运算符号的重载)

版权声明:本文为博主原创,未经博主允许不得转载 https://blog.csdn.net/Sherry_Yue/article/details/85313619

【问题描述】
将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。
在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。
因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。
另外有一个类型转换函数int(),用来将类类型向整型转换,即将二进制形式的类对象转换为整形数。
两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。

class binary {    //定义二进制类
   char bits[16];  //二进制字模数组
public:
   binary(char *);   //字符串参数构造函数
   binary(int);      //整型参数构造函数
   friend binary operator +(binary,binary);   //重载“+”,友元函数
   friend binary operator -(binary,binary);   //重载“-”,友元函数
   operator int();  //类类型转换函数(将类类型向整型转换,即将二进制形式的类对象转换为整形数)
   friend ostream & operator <<(ostream &out, binary &b);//重载“<<”,以二进制形式输出
   void print();//以整型形式输出
};

主函数设计如下,请勿修改:

int main(){
   binary n1="1011";
   binary n2=int(n1)+15;
   binary n3=n1-binary(7);
   cout<<n1<<endl;
   cout<<n2<<endl;
   cout<<n3<<endl;
   cout<<int(n2)+5<<endl;
   n2=n2-binary(5);
   n2.print();
   n3=n3+binary(5);
   n3.print();
   cout<<int(n3)-5<<endl;
   return 0;
}

【样例输出】
0000000000001011
0000000000011010
0000000000000100
31
21
9
4

PS:本题很多算法很简单,关键出错点在于粗心,bits[i]是字符型数组,其和数字的运算转换一定要注意-'0’或+'0’来取值

#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;

class binary //定义二进制类
{
private:
    char bits[16];  //二进制字模数组
public:
    binary(char *);   //字符串参数构造函数
    binary(int);      //整型参数构造函数
    friend binary operator +(binary,binary);   //重载“+”,友元函数
    friend binary operator -(binary,binary);   //重载“-”,友元函数
    operator int();  //类类型转换函数(将类类型向整型转换,即将二进制形式的类对象转换为整形数)
    friend ostream & operator <<(ostream &out, binary &b);//重载“<<”,以二进制形式输出
    void print();//以整型形式输出
};

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 operator +(binary t1,binary t2)   //重载“+”,友元函数
{
    binary tt = (int)t1 + (int)t2;
    return tt;
}

binary operator -(binary t1,binary t2)   //重载“-”,友元函数
{
    binary tt = fabs( (int)t1 - (int)t2 );
    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;
}

int main()
{
    binary n1="1011";
    binary n2=int(n1)+15;
    binary n3=n1-binary(7);
    cout<<n1<<endl;
    cout<<n2<<endl;
    cout<<n3<<endl;
    cout<<int(n2)+5<<endl;
    n2=n2-binary(5);
    n2.print();
    n3=n3+binary(5);
    n3.print();
    cout<<int(n3)-5<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Sherry_Yue/article/details/85313619