c - 在C中输出两个二进制字符串及其十进制值相加的结果

标签 c arrays string gcc bit-manipulation

我正在尝试解决一些位操作问题。这有点乏味,因为我刚刚开始学习如何制作用于练习的位操作函数(技术面试、一般概念、功能、不同的方法等...)

我的问题目标是能够从我编译的程序中添加两个二进制字符串作为我的参数 (./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);
}

为了解释我试图做的是一个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) 而已。有谁知道我该如何解决这个问题?

祝你白天/晚上愉快:)!

最佳答案

我得到了答案,它与我的想法很接近,所以我不得不修复一些问题以使其更具可读性。对我的附加部分进行了有趣的观察,我注意到我不需要无缘无故地转换任何额外的东西。这就是我最终得到的工作解决方案:

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 十进制。我的逻辑失败的任何想法?我从 another post

跟进了这个想法

关于c - 在C中输出两个二进制字符串及其十进制值相加的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52473629/

相关文章:

javascript - 从 Javascript 中的数组中获取最小值?

arrays - 在 Postgres 数组中排序有多可靠?

java - 为返回的字符串值设置参数

javascript - 使用javascript查找字符串中最长的单词

c - 带链表的多项式和

c - 什么是结构中的灵活数组成员?

java - 声明一个数组 (type[] arrayName) 而不是 (type arrayName[])

c++:如何用美元符号将 double 格式化为货币?

Python C接口(interface),不同模块共享静态变量?

c - 如何用 `1234567890` 打印 `1 2 3 4 5 6 7 8 9 0` 到 `C` ?