添加位,更简单

时间:2016-12-28 20:46:28

标签: c bit-manipulation bits

考虑到以字符串char a[]char b[]的形式提供了两个位集,如下面的代码所示。并且给出了添加该位集的任务。我接受并编写以下内容来对两个位集进行求和:

#include <stdio.h>
#include <string.h>

int carry = 0;
char result(char r, int c) {
    char R = '0';
    if (carry) {
        if (c) {
            R = '0';
            carry = 1;
        } else {
            R = r == '0' ? '1' : '0';
            carry = R == '0' ? 1 : 0;
        }
    } else {
        if (c) {
            R = '0';
            carry = 1;
        } else {
            R = r;
            carry = 0;
        }
    }
    return R;
}

char sum(int x, int y) {
    char r = '0';
    if (x ^ y) 
        r = result('1', 0);
    else if (x & y)
        r = result('0', 1);
    else 
        r = result('0', 0);
    return r;
}

int main() { 
    char a[] = "01";
    char b[] = "01";
    char c[] = "00";
    for (int i = strlen(c)-1; i > -1; i--) 
        c[i] = sum(a[i] == '0' ? 0 : 1, b[i] == '0' ? 0 : 1);
    printf("%s\n", c);
}

是否可以使其更简单?

1 个答案:

答案 0 :(得分:0)

#include <stdio.h>
#include <string.h>

void sum_two_charbitsets(int char_count,char*a,char*b,char*result)
{
    int x,i,carry = 0;
    for(i = char_count-1; i >= 0; i--)
    {
      x=(a[i]-'0')+(b[i]-'0')+carry;
      result[i]=(x&1)+'0';
      carry=x>>1;   
    } 
}

int main(int argc, char *argv[])
{
    char a[] = "01";
    char b[] = "01";
    char c[] = "00";
    sum_two_charbitsets(2,a,b,c);
    printf("%s\n", c);
}

在进行数值运算时,为什么不使用数字而不是难以读取充满字符串比较和代码的代码?

为了使用numeric plus运算符,我通过减去/添加char'0'的ASCII数字来使用简单的char&lt; - &gt; int转换。只要字符串只包含预期的字符'0'或'1',这就可以工作。

number&1用于使用二进制AND运算符从整数中减去第一位。

number>>1是二进制移位运算符,它将丢弃第一个位,将第二个位移到第一个位置=&gt;有效地减去它。 (只要没有设置其他位,这对于正确的输入数据不应该发生)