背景知识补充
正数:原码=反码=补码
负数:原码 反码 补码之间 转换有规则(下面讨论)
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