使用按位运算符

时间:2016-01-20 21:00:58

标签: c++

所以我的课的想法是取一串数字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

1 个答案:

答案 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级工作但是这个机器不可用。