版权声明:本文纯属作者口胡,欢迎转载 https://blog.csdn.net/TQCAI666/article/details/80594806
实现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;
}
};