两个二进制数相加

您所在的位置:网站首页 68二进制怎么算 两个二进制数相加

两个二进制数相加

#两个二进制数相加| 来源: 网络整理| 查看: 265

题目如下:

/* Given two binary strings, return their sum (also a binary string).

For example, a = “11” b = “1” Return “100”. */

如果是c语言,就是实现这样的一个函数:

char* addBinary(char* a, char* b) {

}

小白:还好我的英文是4.5级。就是有两个二进制数,求它们的和,并且也表示为二进制数了。很简单啊,把这两个数转成int,再相加,再转成二进制数就行啦!

陆小凤:这个做法解决不了数值大小溢出的问题,在字符串很长的情况下是不可行的。故不考虑这个方向。

小白:… 我就知道你会这么说的。

(1)一个不简洁的迭代办法

使用迭代的办法,逐位相加。

如何迭代?

一个while循环。从低位开始,每次取两个数字及进位相加(如果没有两个数字及进位,则迭代结束),记录本次相加的结果及新的进位值。字符串向高位移动,开始新的一轮迭代。

* 如何相加?

如果按两个数字跟进位的值来分情况判断,会繁琐一点。可以考虑都转化为int,再三者相加,对结果再分类(比如3时,说明新的进位值为1,并且本次相加的结果为1)。

* 如何向高位移动?

先取得两个字符串的最小长度为l,迭代时,每次取str[l_each_str-i-1],i=0 to (l-1),即可。

* 有哪些细节要注意?

在迭代结束后,还要看进位值是否为1。如果为1,则还需要再次迭代。每次拿剩下的数字,跟进位相加,在进位为0或没有剩余数字时结束。迭代结束后,判断进位的值,如果进位的值为1,则说明产生一个新的数字1。如果进位为0,则需要把剩余的数字直接作为返回的字符串的内容。

注意最终返回的字符串,在c语言中要以0结尾。

演示代码

#include

#include

#include

char* addBinary(char* a, char* b) {

int more = 0;

int la = strlen(a);

int lb = strlen(b);

int lmin = la > lb ? lb : la;

int lmax = la > lb ? la : lb;

int retl = lmax + 1;

char* retstr = (char*)malloc(retl);

int i = 0;

while (i < lmin) {

char ca = a[la - i - 1];

char cb = b[lb - i - 1];

int ia = ((ca == '1') ? 1 : 0);

int ib = ((cb == '1') ? 1 : 0);

int temp = ia + ib + more;

if (temp == 3) {

retstr[retl - i - 1] = '1';

more = 1;

}

else if (temp == 2) {

retstr[retl - i - 1] = '0';

more = 1;

}

else if (temp == 1) {

retstr[retl - i - 1] = '1';

more = 0;

}

else {

retstr[retl - i - 1] = '0';

more = 0;

}

i ++;

}

char* left = ((la > lb) ? a : b);

if (more == 1) {

while (i < lmax && more) {

char c = left[lmax - i - 1];

int ic = (c == '1') ? 1 : 0;

int temp = ic + more;

if (temp == 2) {

retstr[retl - i - 1] = '0';

more = 1;

}

else if (temp == 1) {

retstr[retl - i - 1] = '1';

more = 0;

}

i ++;

}

}

if (more == 1) {

retstr[0] = '1';

char* rettemp = (char*)malloc(retl + 1);

memmove(rettemp, retstr, retl);

rettemp[retl] = 0;

free(retstr);

retstr = rettemp;

}

else {

if (i =0 || j>=0) {

c += i>=0 ? a[i--]-'0' : 0;

c += j>=0 ? b[j--]-'0' : 0;

ret += char(c&1) + '0';

c >>= 1;

}

reverse(ret.begin(), ret.end());

return ret;

    }

};

int main(int argc, const char *argv[])

{

string a="100";

string b="110010";

Solution so;

string ret = so.addBinary(a, b);

cout



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3