1.11M Members

Hi there,

I tried binary addition. It seems to work fine. Could someone tell me if there's a better way of doin this or any bugs that could be uncovered in the code below?

Thanks,
Tina

``````#include <stdio.h>

int main()
{
char op1[20], op2[20];
char sum[20];
char *p, *p1;

fgets(op1, sizeof(op1), stdin);
fgets(op2, sizeof(op2), stdin);

if( (p = strchr(op1, '\n')) != NULL)
*p = '\0';

if( (p1 = strchr(op2, '\n')) != NULL)
*p1 = '\0';

return 0;
}

{
int carry = 0;
int flen = strlen(first);
int slen = strlen(second);

char *tfirst = first + strlen(first) - 1;
char *tsecond = second + strlen(second) - 1;

int *result = malloc(sizeof(int) * 16);
int *temp = result;

for(; flen > 0 || slen > 0; flen--, slen--)
{
if((*tfirst - '0') ^ (*tsecond - '0'))
{
if(!carry)
{
*temp++ = 1 + carry;
carry = 0;
}
else
*temp++ = 0;
}
else
{
if((*tfirst - '0') & (*tsecond -'0'))
{
*temp++ = (0 + carry);
carry = 1;
}
else
{
*temp++ = (0 + carry);
carry = 0;
}
}

tfirst--;
tsecond--;
}

if (carry == 1)
{
*temp++ = carry;
}

while(temp-- != result)
printf("%d", *temp);

free(result);
}``````

why so complicated? all you really need is "strtol()" and the addition operator.

``````int binaryAdd(char *first, char *second, int *sum)
{
int val1, val2;
char *ptr1, *ptr2;
size_t length;

val1 = strtol(first,&ptr1,2);
val2 = strtol(second,&ptr2,2);

if (ptr1 == first || ptr2 == second)
{
printf("\ninvalid entry.\n\n");
return 0;
}

length = ptr1-first;
if ((ptr2-second) > length)
length = ptr2-second;

*sum = val1+val2;

printf("\n  %*s (%d)\n+ %*s (%d)\n\n= %*s (%d)\n\n",
length, first, val1, length, second, val2, length, " ", *sum);

return 1;
}``````

(The rest is just decoration)

I'll leave conversion of the numeric sum, back into a binary string, as an exercise to the reader :P

.

Hi,

Thanks for responding!

I was thinking of doing it at the bit level using the bit operators.

Thanks again,
Tina

at the "bit level", every integer is inherently binary and hex and decimal... it does not matter, because there's only a difference when you print it.

so, you can make it hard if you like, just for the sake of having a challenge or if your instructor requires you to do so for learning purposes.

but if you're not required to make it difficult, i'd say use the <stdlib.h> standard library functions whenever possible.

Well, this isn't at the bitlevel,

you are interpreting the ascii values '0' '1' as bit 0 and bit 1.

If you are interested in this bitlevel stuff,
you should look into the shift operations. like

``````unsigned char x=7;
unsigned char y=x<<1;
//y is now 7 times 2``````

But it looks nice your code,
one thing though, you don't need

``````if (carry == 1)
*temp++ = carry;
//just
if(carray)``````

A good exercise is to write you addition program with a non fixed base like,

digit_n = (digit_{n-1}\textrm{ div }base) + (digit_n\textrm{ mod }base)

why so complicated? all you really need is "strtol()" and the addition operator.

``````int binaryAdd(char *first, char *second, int *sum)
{
int val1, val2;
char *ptr1, *ptr2;
size_t length;

val1 = strtol(first,&ptr1,2);
val2 = strtol(second,&ptr2,2);

if (ptr1 == first || ptr2 == second)
{
printf("\ninvalid entry.\n\n");
return 0;
}

length = ptr1-first;
if ((ptr2-second) > length)
length = ptr2-second;

*sum = val1+val2;

printf("\n  %*s (%d)\n+ %*s (%d)\n\n= %*s (%d)\n\n",
length, first, val1, length, second, val2, length, " ", *sum);

return 1;
}``````

(The rest is just decoration)

I'll leave conversion of the numeric sum, back into a binary string, as an exercise to the reader :P

.

Can u pls explain me where's input: printf("Enter 1st ...
("Enter 2nd binary ...
and output: printf("Result=... ?

i'm looking for a binary addition, without using library, just stdio.h

how to perform 64 bit addition in c with code and explanation?

You