zoukankan      html  css  js  c++  java
  • 二进制类(运算符号的重载)

    【问题描述】
    将一个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;
    }
    
    
  • 相关阅读:
    WinRAR5.01注册码附注册机
    PS不能存储,因为程序错误
    mysql中 date datetime time timestamp 的区别
    sublime text 3 3126 注册码+中文包
    IIS7.5 用 IIS AppPool应用程序池名 做账号 将各站点权限分开
    linux vi 报错 E37: No write since last change (add ! to override)
    Linux 安装 apache2.4.23
    三级分类及名称及列表
    二级栏目名称及列表
    每隔N行输出不同样式
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626144.html
Copyright © 2011-2022 走看看