所以我的课的想法是取一串数字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 guys
答案 0 :(得分:1)
您需要一次添加一位数(4位),因为9 + 9 = 18和18不适合4位。
然而,x-oring多位数字不是正确的操作..正确的求和算法类似于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提供{ {1}}修正添加结果的说明。)
在C级工作但是这个机器不可用。