1. 程式人生 > >編寫C++程式碼理解原碼和補碼

編寫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; } };