Я пытаюсь пройти через некоторые проблемы с манипуляциями.Это немного утомительно, потому что я только начинаю изучать, как создавать функции, которые выполняют битовые манипуляции для практики (технические интервью, общие концепции, функциональные возможности, различные подходы и т. Д.)
Моя цель сМоя проблема заключается в том, чтобы добавить две двоичные строки в качестве параметров из моей скомпилированной программы (./a.out binary1 + binary2
).Мы ограничены тем, что длина всегда будет иметь размер 6 символов (000000 для минимального значения и 111111 для максимального двоичного значения, плюс она никогда не будет выше 111111).Результат сложения обеих двоичных строк даст нам другое двоичное строковое число И десятичное представление.Для быстрого примера, если мы запустим ./a.out 000010 + 000001
, наш вывод должен дать нам 000011 (3)
.
Это мой decrypt.c
файл:
int toInt(char *bits)
{
int decimal = 0;
int base = 1;
int len = strlen(bits);
for (int i = len-1; i >= 0; i--)
{
if (bits[i] == '1')
decimal += base;
base *= 2;
}
return (decimal);
}
int makeEqualLength(char *str1, char *str2)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
if (len1 < len2)
{
for (int i = 0 ; i < len2 - len1 ; i++)
str1 += '0';
return len2;
}
else if (len1 > len2)
{
for (int i = 0 ; i < len1 - len2 ; i++)
str2 += '0';
}
return len1; // If len1 >= len2
}
char *getSum(char *a, char *b)
{
int len = makeEqualLength(a, b);
char *res = calloc(6, sizeof(char*));
int num_a;
int num_b;
int c = 0;
int total = 0;
for (int i = len - 1; i >= 0; i--)
{
num_a = toInt(a) - '0';
num_b = toInt(b) - '0';
total = (num_a ^ num_b ^ c) + '0';
res[i] += (char)total;
c = (num_a & num_b) | (num_b & c) | (num_a & c);
}
if (c)
res += (char)'1';
return (res);
}
Чтобы объяснить, что я пыталсяdo - это метод half-adder , в котором у вас есть носитель сложения и результата.Сначала мне нужно определить размер обеих двоичных строк, сделав функцию с именем makeEqualLength
.Это позволит получить размер обеих строк и использовать его позже на половинном сумматоре.Чтобы сделать двоичные числа десятичными, я проверяю, есть ли символ, представляющий 1
в любой базе.Если есть 1
, то добавьте его к десятичной дроби.Мой результат с удержанием является результатом добавления двух двоичных строк.
И это файл main.c
, с которым нужно работать:
#include <stdio.h> //printf, scanf, ...
#include <string.h> //memcpy, strlen, ...
#include <unistd.h> //fork, write, sleep...
#include <stdlib.h> //malloc, free, exit...
#include "header.h"
int main(int ac, char **av)
{
char *a;
char *b;
if (ac == 4 && strcmp(av[2], "+") == 0
&& strlen(av[1]) == 6 && strlen(av[3]) == 6
&& checkBinary(av[1]) && checkBinary(av[3])) {
a = av[1];
b = av[3];
}else{
printf("Usage: ./sum 000010 + 000001\n");
return (0);
}
char *sum;
sum = getSum(a, b);
printf("%s (%d)\n", sum, toInt(sum));
return (0);
}
int checkBinary(char *str) {
int i = 0;
while (str[i]) {
if (str[i] != '0' && str[i] != '1')
return (0);
i++;
}
return (1);
}
Мой ответ не возвращается правильно, который дает мне (0)
и больше ничего.У кого-нибудь есть идеи, как я могу решить эту проблему?
Хорошего дня / ночи:)!