• 二进制类的完善(特殊运算符的重载)


    【问题描述】
    在上一题的基础上,将 + 、 - 运算符定义为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;
    }
    
    
  • 相关阅读:
    不喜欢数据库编程
    配置 yum 源的两种方法
    编译内核后iptables无法启动问题
    国外免费空间
    iptables--静态防火墙实例教程
    25 Most Frequently Used Linux IPTables Rules Examples
    如何开启或关闭SELinux
    google提供免费企业邮局
    RAID 0, RAID 1, RAID 5, RAID 10 Explained with Diagrams
    CentOS软件管理之fastestmirror和RPMforge
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626143.html
Copyright © 2020-2023  润新知