2016-01-20 25 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级别工作,但此机器不可用。