编写C++代码理解原码和补码

实现Digits

首先编写一个Digits类,实现了一下功能:

  • 将用字符串表示的补码变为32位整数(int)真值

  • 将原码转换为补码(都是字符串表示)

  • 将任意数据类型的一个变量转换为字符串表示的补码,高位补0


代码:


class Digits
{
    private:
    string char_multi(char obj,int mul){
        string ans;
        for(int i=0;i<mul;i++){
            ans+=obj;
        }
        return ans;
    }
    void reverse_digit(string& digits,int s,int e){//对字串digits的[s,e)区域的数字取反码 
        for(int i=s;i<e;i++){
            if(digits[i]=='0')
                digits[i]='1';
            else
                digits[i]='0';
        }
    }
    public:
    string original_to_complement(string digits,bool isNagetive){//原码转补码
        //高位补0 
        int lack=31-digits.length();
        digits=(isNagetive?"1":"0") + char_multi('0',lack) + digits;
        //进行遍历,对于第一个1的位置,对其左边一直到符号位,取反
        int e=31;
        if(isNagetive){
            while(e>=0 && digits[e]!='1') e--;  //找到第一个1
            reverse_digit(digits,1,e);
        }
        return digits;
    }
    int digits_to_int(string digits){   //把一个字符串表示的编码转换为一个int数字真值 
        int ans=0;
        int bit=1;//对bit进行移位
        int len=digits.length();
        for(int i=len-1;i>=0;i--){//对 digits 从后往前遍历 
            if(digits[i]=='1'){
                ans|=bit;   //加上这一位 
            }
            bit<<=1;    //bit左移一位
        } 
        //如果len不足32,则直接退出循环,表示高位补0 
        return ans;
    }
    template <class T>
    string trueValue_to_digits(T value){//将一个任意类型的真值转换为补码(高位补0) 
        string ans="";
        T bit=1;
        while(value){
            if(value & bit){
                ans='1'+ans;
            }else{
                ans='0'+ans;
            }
            value>>=1;
        }
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值