2013-11-14 3 views
2

Я пытаюсь добавить две двоичные цифры. Выход прекрасен, за исключением последнего бита. Последний бит не отображается, как показано на рисунке ниже кода. Кто-нибудь знает, что здесь не так?Показать последний бит после двоичного добавления

int main(){ 
char C[9]={'\0','\0','\0','\0','\0','\0','\0','\0','\0'}; 
char B[9]={'0','1','0','0','0','0','0','1','\0'}; 
char A[9]={'0','1','0','0','0','0','0','0','\0'}; 
char sum[9]={'\0','\0','\0','\0','\0','\0','\0','\0','\0'}; 
char carry='0'; 

for(int i = 7; i >= 0; i--) {  
    C[i] = (A[i]^B[i])^carry; 
    carry = A[i] & B[i]; 
} 
cout << A << endl << B << endl << C << endl; //output shown below 

//for wrap-around carry 
for(int i = 7; carry!=0; i--) { 
    sum[i] = C[i]^carry; 
    carry = C[i] & carry; 
} 
return 0; 
} 

Shows the output, the last digit is missing.

+1

Я думаю, что ваш алгоритм пропускает возможность повторного переноса. Рассмотрим '001 + 011'. Есть две вещи, а не одна. – MSalters

+1

Что такое 'sum' как? – patchwork

+2

Хм. Предложенный код, похоже, работает, когда я запускаю его на ideone. http://ideone.com/PewJPt Хотя вход отличается от отображаемого здесь. – drescherjm

ответ

3

Предлагаю вам ознакомиться с the full Adder algorithm. Это показывает, как суммировать двоичные числа и вычислять перенос.

Кроме того, если вы используете числа, превышающие 0, я предлагаю вам использовать unsigned char.

Теперь, вот пример того, как сумма должна работать после полной Adder работы:

for(i = 0; i < 8 ; i++){ 
    C[i] = ((A[i]^B[i])^carry); 
    carry = ((A[i] & B[i]) | (A[i] & carry)) | (B[i] & carry); 
} 
+0

спасибо, проверит это – sara

1

Вы не добавив две цифры в двоичной операции.

Вместо этого вы используете строки.

Если вы используете int для своих значений, вы можете использовать двоичные операторы. как «&»

myVar & 1 даст вам наименьшее количество бит.

+0

Домашнее задание, вероятно, требует использования строк c. Хотя ОП должен уточнить. – drescherjm

+0

Нет, я пытался использовать int массивы, но вывод, который я получил, не был целым, был в шестнадцатеричном виде :( – sara

+1

hexadecimal означает, что вы напечатали адрес массива, а не его содержимое. – drescherjm

Смежные вопросы