Вывод результата сложения двух двоичных строк с их десятичным значением в C - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь пройти через некоторые проблемы с манипуляциями.Это немного утомительно, потому что я только начинаю изучать, как создавать функции, которые выполняют битовые манипуляции для практики (технические интервью, общие концепции, функциональные возможности, различные подходы и т. Д.)

Моя цель сМоя проблема заключается в том, чтобы добавить две двоичные строки в качестве параметров из моей скомпилированной программы (./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) и больше ничего.У кого-нибудь есть идеи, как я могу решить эту проблему?

Хорошего дня / ночи:)!

1 Ответ

0 голосов
/ 25 сентября 2018

Я получил ответ, он близок к тому, что я думал, поэтому мне пришлось исправить несколько вещей, чтобы сделать его более читабельным.Интересное наблюдение с моей добавочной частью, и я заметил, что мне не нужно ничего разыгрывать без причины.Это то, что я в итоге получил для своего рабочего решения :

char    *getSum(char *a, char *b)
{
    char *res = calloc(7, sizeof(*res));
    int num_a;
    int num_b;
    int c = 0;

    for (int i = 5; i >= 0; i--)
    {
        num_a = (a[i] == '1') ? 1 : 0;
        num_b = (b[i] == '1') ? 1 : 0;
        c += num_a + num_b;
        res[i] += (c % 2) + '0';
        c /= 2;
    }
    return (res);
}

Теперь в этом примере я попытался использовать половину сумматора с помощью битовых манипуляций, но этонеправильно выводить мои числа:

char    *getSum(char *a, char *b)
{
    char *res = calloc(7, sizeof(*res));
    int num_a;
    int num_b;
    int c = 0;

    res[6] = '\0';
    for (int i = 5; i >= 0; i--)
    {
        num_a = (a[i] == '1') ? 1 : 0;
        num_b = (b[i] == '1') ? 1 : 0;
        c = (((num_a ^ num_b)) ^ c) + '0';
        res[i] += (c % 2) + '0';
        c = ((num_a & num_b) | (num_b & c)) | (num_a & c);
    }
    return (res);
}

Я предпочитаю последний пример, но когда дело доходит до сложения чисел / двоичных файлов, он будет выводить неправильно (000010 + 000001 дает мне -> 000001 в виде двоичного и1 в десятичном виде. Есть идеи, где моя логика не работает? Я развил эту идею из другой пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...