編寫C++程式碼理解原碼和補碼
阿新 • • 發佈:2018-12-31
實現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;
}
};