2016-01-20 23 views
0

所以我的課的想法是把數字const char* s = "123456654987"一串我把每對夫婦數量,並將它們存儲在一個字節 num[0] = 12 , num[1] = 34等等..... 我這是怎麼做的除了使用位運算符

unsigned char* num; 
num = new unsigned char[ strlen(s)/2 + strlen(s)%2]; 
    if(strlen(s)%2 == 1) 
    num[0] = s[0]-'0'; 
     unsigned int i; 
     int j=strlen(s)%2; 
     for(i=strlen(s)%2;i<strlen(s);i+=2) 
     { 
         int left = s[i] - '0'; 
         int right = s[i+1] - '0'; 
         num[j] = left << 4 ; 
         num[j] |= right; 
         j++; 
     } 

例如S [0] = 12在內存中表示爲00010010不是00000110 ,但現在,我試圖重載+ =操作我不知道如何着手 我最好的嘗試是這個,但即使我知道這是不會去工作

int i,sum,carry=0; 
    for(i=this->size-1;i>=0;i--) 
    { 
     sum = ((num[i]^rhs.num[i])^carry); 
     carry = ((num[i] & rhs.num[i]) | (num[i] & carry)) | (rhs.num[i] & carry); 
     num[i] = sum; 
    } 

anyhelp傢伙

+0

我正在考慮做4加4位將工作? – user259584

+2

您可能想要谷歌的「二進制編碼的十進制」的靈感。 –

+0

@AndyG他已經通過減去'0'來做到這一點。不同的表示,相同的結果。 –

回答

1

你需要做的除了一個數字(4位),在同一時間,因爲9 + 9 = 18和18不會在4位適合。

X-O形環多位數字然而,這不是正確的操作..正確的算法和是做一個時候像

int carry = 0; 
for(int i=0; i<n; i++) { 
    if ((i & 1) == 0) { 
     int x = (a[i] & 15) + (b[i] & 15) + carry; 
     result[i] = (x & 15); 
     carry = x > 15; 
    } else { 
     int x = (a[i] >> 4) + (b[i] >> 4) + carry; 
     result[i] |= (x << 4); 
     carry = x > 15; 
    } 
} 

彙編很多處理器合作支持的低4位溢出檢測操作,並且有特定的指令來「修復」結果,以便它成爲正確的兩位二進制十進制表示形式(例如,x86提供了​​指令來修復加法結果)。

在C級別工作,但此機器不可用。