Commit c28a9717d5e1e2aa9fa49f7d86cc05da85aa7c47

Authored by Imanol-Mikel Barba Sabariego
1 parent 824bccd3

--no commit message

arith/Makefile
1   -TARGETS = adder substractor multiplier divider negator comparator shifter
  1 +TARGETS = adder substractor multiplier divider negator comparator shifter bit_adder
2 2  
3 3 .PHONY: all clean
4 4  
... ... @@ -20,4 +20,6 @@ negator:
20 20 comparator:
21 21 gcc -I../common/ ../common/auxiliar.c comparator.c -o comparator
22 22 shifter:
23   - gcc -I../common/ ../common/auxiliar.c shifter.c -o shifter
24 23 \ No newline at end of file
  24 + gcc -I../common/ ../common/auxiliar.c shifter.c -o shifter
  25 +bit_adder:
  26 + gcc -I../common/ ../common/auxiliar.c bit_adder.c -o bit_adder
25 27 \ No newline at end of file
... ...
arith/bit_adder.c
... ... @@ -2,8 +2,30 @@
2 2 #include <string.h>
3 3 #include "auxiliar.h"
4 4  
  5 +int check_length(char **inputs, uint8_t num_inputs)
  6 +{
  7 + int input_length = strlen(inputs[0]);
  8 + int i;
  9 + for(i = 1; i < num_inputs; i++)
  10 + {
  11 + if(input_length != strlen(inputs[i]))
  12 + {
  13 + return -1;
  14 + }
  15 + }
  16 + int max_value = 1;
  17 + int max_bits = num_inputs * input_length;
  18 + i = 0;
  19 + while(max_value <= max_bits)
  20 + {
  21 + max_value = 0x1 << ++i;
  22 + }
  23 + return i;
  24 +}
  25 +
5 26 int main(int argc, char **argv)
6 27 {
  28 + int i;
7 29 if(argc != 2)
8 30 {
9 31 error();
... ... @@ -19,14 +41,13 @@ int main(int argc, char **argv)
19 41 error();
20 42 }
21 43 int num_inputs = num_occurrences(input,',');
22   - if(num_inputs != 1)
  44 + int input_length = check_length(inputs,num_inputs);
  45 + int count = 0;
  46 + for(i = 0; i < num_inputs; i++)
23 47 {
24   - error();
  48 + count += count_bits(inputs[i]);
25 49 }
26   - int input_length = strlen(inputs[0]);
27   - int num = bin2dec(inputs[0]);
28   - num *= -1;
29   - char *result = dec2bin(num,input_length);
  50 + char *result = dec2bin(count,input_length);
30 51 printf("%s",result);
31 52 free(result);
32 53 free_mem(inputs,num_inputs);
... ...
common/auxiliar.c
... ... @@ -234,4 +234,19 @@ void reverse_two_complement(char *bin)
234 234 char *bin_added = dec2bin(bin2dec(bin)+1,strlen(bin));
235 235 strcpy(bin,bin_added);
236 236 free(bin_added);
  237 +}
  238 +
  239 +int count_bits(char *input)
  240 +{
  241 + int i;
  242 + int count = 0;
  243 + int input_length = strlen(input);
  244 + for(i = 0; i < input_length; i++)
  245 + {
  246 + if(input[i] == '1')
  247 + {
  248 + count++;
  249 + }
  250 + }
  251 + return count;
237 252 }
238 253 \ No newline at end of file
... ...
common/auxiliar.h
... ... @@ -19,3 +19,4 @@ int bin2udec(char *bin);
19 19 char* dec2bin(int dec, int length);
20 20 void expand_input(char **input, int required_length);
21 21 void reverse_two_complement(char *bin);
  22 +int count_bits(char *input);
22 23 \ No newline at end of file
... ...