2016-01-20 2 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

Возможно, вам понадобится «двоичная кодированная десятичная цифра» Google для вдохновения. –

+0

@ AndyG он уже делает это, вычитая '0'. Различное представление, тот же результат. –

ответ

1

Вам нужно будет сделать при добавлении одной цифры (4 бит), в то время, потому что 9 + 9 = 18 и 18 не будет вписываться в 4 бита.

х-Оринг мультибитовых цифры, однако, не правильная работа .. правильный алгоритм сумма-то вроде

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 предоставляет команду DAA для исправления результата добавления).

Работая на уровне C, однако это оборудование недоступно.