2016-12-28 5 views
0

Учитывая, что два набора битов предоставляются в виде строк, char a[] и char b[], как в коде ниже. И задается задача добавления этих битов. Я беру его и написал следующее, чтобы суммировать два бита:Добавление битов, проще

#include <stdio.h> 
#include <string.h> 

int carry = 0; 
char result(char r, int c) { 
    char R = '0'; 
    if (carry) { 
     if (c) { 
      R = '0'; 
      carry = 1; 
     } else { 
      R = r == '0' ? '1' : '0'; 
      carry = R == '0' ? 1 : 0; 
     } 
    } else { 
     if (c) { 
      R = '0'; 
      carry = 1; 
     } else { 
      R = r; 
      carry = 0; 
     } 
    } 
    return R; 
} 

char sum(int x, int y) { 
    char r = '0'; 
    if (x^y) 
     r = result('1', 0); 
    else if (x & y) 
     r = result('0', 1); 
    else 
     r = result('0', 0); 
    return r; 
} 

int main() { 
    char a[] = "01"; 
    char b[] = "01"; 
    char c[] = "00"; 
    for (int i = strlen(c)-1; i > -1; i--) 
     c[i] = sum(a[i] == '0' ? 0 : 1, b[i] == '0' ? 0 : 1); 
    printf("%s\n", c); 
} 

Возможно ли это сделать проще?

+4

Я думаю, что ваш вопрос лучше подходит для codereview http://codereview.stackexchange.com/ –

+0

Гора из мухи. Код кажется запутанным. Было бы ясно добавить две цифры (источники и результат, скорректированные для символьного значения) и передать «перенос» на следующую цифру влево. Затем он будет работать на столько цифр, сколько вы можете пожелать (но, очевидно, но не огромен). что может быть сделано в одном маленьком цикле. –

+0

Вы исходите из фона VHDL/Verilog случайно? –

ответ

0
#include <stdio.h> 
#include <string.h> 

void sum_two_charbitsets(int char_count,char*a,char*b,char*result) 
{ 
    int x,i,carry = 0; 
    for(i = char_count-1; i >= 0; i--) 
    { 
     x=(a[i]-'0')+(b[i]-'0')+carry; 
     result[i]=(x&1)+'0'; 
     carry=x>>1; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    char a[] = "01"; 
    char b[] = "01"; 
    char c[] = "00"; 
    sum_two_charbitsets(2,a,b,c); 
    printf("%s\n", c); 
} 

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

Чтобы использовать числовой оператор plus, я использовал простые char < -> int преобразования путем вычитания/добавления числа ASCII char '0'. Это будет работать до тех пор, пока строки содержат только ожидаемые символы «0» или «1».

number&1 используется для вычитания первого бита из целого числа с использованием двоичного оператора AND.

number>>1 - оператор двоичного сдвига, который отбрасывает первый бит, перемещая второй бит в первое положение => эффективно вычитая его. (до тех пор, пока никакой другой бит не будет установлен, что не должно происходить для правильных входных данных)

+1

Помимо этого 'void main()' неверно, этот код не работает по той же причине, что и код OP. См. Мои комментарии по оригинальному вопросу. –

+0

Вопрос был сломан, теперь я думаю, что все в порядке. – KcFnMi

+2

Когда вы предоставляете ограничение данных меньше, то возможный результат, конечно, вы получите переполнение. Этот код не приведет к ошибке доступа к памяти в этом случае, он просто не сохранит последний бит в любом месте, что похоже на поведение добавления целых чисел в C. Использование динамического realloc кажется излишним для этой задачи. Возможно, вы можете распечатать сообщение об ошибке и принудительно закрыть программу, когда бит переноса остается установленным в конце цикла. – David162795

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