概述
LeetCode : 67. 二进制求和
本题大意: 给定两个二进制字符串 >> 计算相加后的二进制字符串
这题让我想到了一道用二进制计算的题目 (可互为变形吧 ??) >> 给定两个十进制数,不允许使用加法等运算符, 求和
位运算求和: 剑指 Offer 65. 不用加减乘除做加法
- 位运算
- 暴力模拟
- 先转为十进制 >> 十进制相加 >> 转二进制
位运算
java.lang.NumberFormatException:
For input string:
“10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101” under radix 2
I n t e g e r 和 L o n g Integer 和 Long Integer和Long 都存不下 二进制字符串的长度
// 要导 BigIntger 包
import java.math.BigInteger;
class Solution {
public String addBinary(String a, String b) {
// 可以存 500000001 位长度的二进制字符
BigInteger c = new BigInteger(new BigInteger(a, 2).toString(10));
BigInteger d = new BigInteger(new BigInteger(b, 2).toString(10));
while (d.compareTo(new BigInteger("0")) != 0){
BigInteger res = c.xor(d); // 异或
BigInteger carry = (c.and(d)).shiftLeft(1); // and 左移
c = res;
d = carry;
}
return c.toString(2);
}
}
暴力模拟
最朴素的方法: 就普通的十进制加法 >> 变成了满二进一
public String addBinary(String a, String b) {
StringBuffer c = new StringBuffer(a).reverse();
StringBuffer d = new StringBuffer(b).reverse();
int lenc = c.length(), lend = d.length();
int i = 0;
int k = 0;
for (i = 0; i < lenc && i < lend ; i++) {
// 满 2 进 1
int temp = (c.charAt(i) - '0') + (d.charAt(i) - '0') + k;
k = 0;
if(temp >= 2) {
temp = temp % 2;
k = 1;
}
c.replace(i, i + 1, temp + "");
}
while (i < lenc){
int temp = (c.charAt(i) - '0') + k;
k = 0;
if(temp >= 2){ temp = temp % 2; k = 1; }
c.replace(i, i + 1, temp + "");
i++;
}
while (i < lend){
int temp = (d.charAt(i) - '0') + k;
k = 0;
if(temp >= 2){ temp = temp % 2; k = 1; }
c.append(temp);
i++;
}
if(k != 0) c.append(k);
return c.reverse().toString();
}
注:
最后
以上就是想人陪萝莉为你收集整理的67. 二进制求和 (位运算)的全部内容,希望文章能够帮你解决67. 二进制求和 (位运算)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复