【经典算法】:原码,反码,补码之间的转换问题

背景知识补充

正数:原码=反码=补码
负数:原码 反码 补码之间 转换有规则(下面讨论)
0:分为+0 和 -0去考虑,符合上面那两条规则

补充一个概念叫做符号位,把每个数第一位当作符号位,取0为整数,取1为负数

对负数的讨论:
1,原码到反码 除符号位 全部 翻转
比如说: 原码:100001 反码应该为 111110 (后面五位全部翻转)
2,反码到补码(可以不看,直接看第三条比较简单,但是还是知道比较好) 整体加上1
例子: 反码:111110 补码:111111 (整体加1) 但是符号位永远不运算
3,原码到补码 从原码右往左看,找到第一个1 左边除符号位全部翻转,右边保持
例子:原码:100001 补码:111111 (看懂了吗?不懂留言)

实现代码

实现代码全是参照上面的规则写的,很简单的

/// author:seen
/// time:2015-09-24
/// 输入原码求补码的工具
#include <iostream>
#include <string>
using namespace std;
void main(){
    cout<<"请输入原码,如果是整数,符号位一定要写0"<<endl;
    string s;
    cin>>s; 
    if(s[0]=='0'){
        cout<<"原码,反码,补码都是:"<<s<<endl;
    }
    else{   
        cout<<"原码:"<<s<<endl;

        cout<<"反码:";
        cout<<"1";        //符号位
        for(int i=1;i<s.length();i++){
            if(s[i]=='.') cout<<s[i];
            else if(s[i]=='1') cout<<'0';
            else cout<<'1';
        }

        cout<<endl<<"补码:";
        for(i=s.length();i>=0;i--){
            if(s[i]=='1'){
                cout<<"1";          //符号位
                for(int m=1;m<i;m++){                      //这里还出这么大的篓子。。
                    if(s[m]=='.') cout<<s[m];
                    else if(s[m]=='1') cout<<'0';
                    else cout<<'1';
                }
                for(m=i;m<s.length();m++){
                    cout<<s[m];
                }
                break;
            }
        }
        cout<<endl;
    }
    system("pause");
}

运行截图

这里写图片描述

happy coding ^_^
seen


  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值