java 中用于接受 2 个二进制数并返回它们的和的最短代码是什么?
What is the shortest code in java for accepting 2 binary numbers and returning their sum?
我需要将两个二进制数相加并 return 求和。不允许进行碱基转换。我知道使用数组的长方法。但是还有更短的吗?更短的意思是 "having smaller code length"。提前致谢。
如果我不够明确,这里有一个例子:
输入:
1101
11
输出:10000
两个(二进制)整数 a
和 b
的总和可以计算为 a+b
,因为所有算术都是用二进制完成的。
如果您的输入是人类可读的字符串而不是二进制,您可以使用标准 BigInteger class:
计算它们的二进制总和
import java.math.BigInteger;
String sum(String a, String b) {
return new BigInteger(a, 2).add(new BigInteger(b, 2)).toString(2);
}
将二进制数表示为两个字符串。反转两个字符串。然后,您可以同时遍历两个字符串,将值添加到三个数组,两个代表从字符串中添加的二进制数字,第三个代表进位数字。创建代表答案的第四个数组(您可能必须找到答案可能的长度限制)。
使用标准二进制加法填充答案数组:
0 + 0 = 0 in the same position,
1 + 0 = 0 + 1 = 1 in the same position,
1 + 1 = 0 in the same position, and carry a 1 to the next position,
1 + 1 + 1 = 1 in the same position, and carry a 1 to the next position.
反转数组,您将得到二进制数的答案。
这里有几个选项,不使用 Java 提供的任何实用方法。这些不考虑符号(前导 +/-),因此它们只处理整数。
第一种方法将二进制字符串转换为整数,将整数相加,然后将结果转换回二进制。它使用局部方法内部 class Convert
来避免为每个参数重复 binaryToInt()
代码。
static String binaryAdd1(String binary1, String binary2) {
class Convert {
int binaryToInt(String binary) {
int result = 0;
for (int i = 0; i < binary.length(); i++) {
char c = binary.charAt(i);
result *= 2;
if (c == '1') {
result++;
} else if (c != '0') {
throw new IllegalArgumentException(binary);
}
}
return result;
}
}
final Convert convert = new Convert();
int int1 = convert.binaryToInt(binary1);
int int2 = convert.binaryToInt(binary2);
String result = "";
int temp = int1 + int2;
do {
result = ((temp & 1) == 1 ? '1' : '0') + result;
temp >>= 1;
} while (temp > 0);
return result;
}
第二种方法使用二进制加法逻辑,如 JHaps 在他的回答中指定的那样,直接将两个参数加在一起。这里没有到整数的中间转换。
static String binaryAdd2(String binary1, String binary2) {
final String validDigits = "01";
String binarySum = "";
// pad the binary strings with one more significant digit for carrying
String bin1 = '0' + binary1;
String bin2 = '0' + binary2;
// add them together starting from least significant digit
int index1 = bin1.length() - 1;
int index2 = bin2.length() - 1;
boolean carry = false;
while (index1 >= 0 || index2 >= 0) {
char char1 = bin1.charAt(index1 >= 0 ? index1 : 0);
char char2 = bin2.charAt(index2 >= 0 ? index2 : 0);
if (validDigits.indexOf(char1) < 0)
throw new NumberFormatException(binary1);
if (validDigits.indexOf(char2) < 0)
throw new NumberFormatException(binary2);
if (char1 == char2) {
binarySum = (carry ? '1' : '0') + binarySum;
carry = char1 == '1';
} else {
binarySum = (carry ? '0' : '1') + binarySum;
}
index1--;
index2--;
}
if (binarySum.length() > 1 && binarySum.charAt(0) == '0') {
binarySum = binarySum.substring(1);
}
String result = binarySum.toString();
return result;
}
我需要将两个二进制数相加并 return 求和。不允许进行碱基转换。我知道使用数组的长方法。但是还有更短的吗?更短的意思是 "having smaller code length"。提前致谢。
如果我不够明确,这里有一个例子:
输入:
1101
11
输出:10000
两个(二进制)整数 a
和 b
的总和可以计算为 a+b
,因为所有算术都是用二进制完成的。
如果您的输入是人类可读的字符串而不是二进制,您可以使用标准 BigInteger class:
计算它们的二进制总和import java.math.BigInteger;
String sum(String a, String b) {
return new BigInteger(a, 2).add(new BigInteger(b, 2)).toString(2);
}
将二进制数表示为两个字符串。反转两个字符串。然后,您可以同时遍历两个字符串,将值添加到三个数组,两个代表从字符串中添加的二进制数字,第三个代表进位数字。创建代表答案的第四个数组(您可能必须找到答案可能的长度限制)。
使用标准二进制加法填充答案数组:
0 + 0 = 0 in the same position,
1 + 0 = 0 + 1 = 1 in the same position,
1 + 1 = 0 in the same position, and carry a 1 to the next position,
1 + 1 + 1 = 1 in the same position, and carry a 1 to the next position.
反转数组,您将得到二进制数的答案。
这里有几个选项,不使用 Java 提供的任何实用方法。这些不考虑符号(前导 +/-),因此它们只处理整数。
第一种方法将二进制字符串转换为整数,将整数相加,然后将结果转换回二进制。它使用局部方法内部 class Convert
来避免为每个参数重复 binaryToInt()
代码。
static String binaryAdd1(String binary1, String binary2) {
class Convert {
int binaryToInt(String binary) {
int result = 0;
for (int i = 0; i < binary.length(); i++) {
char c = binary.charAt(i);
result *= 2;
if (c == '1') {
result++;
} else if (c != '0') {
throw new IllegalArgumentException(binary);
}
}
return result;
}
}
final Convert convert = new Convert();
int int1 = convert.binaryToInt(binary1);
int int2 = convert.binaryToInt(binary2);
String result = "";
int temp = int1 + int2;
do {
result = ((temp & 1) == 1 ? '1' : '0') + result;
temp >>= 1;
} while (temp > 0);
return result;
}
第二种方法使用二进制加法逻辑,如 JHaps 在他的回答中指定的那样,直接将两个参数加在一起。这里没有到整数的中间转换。
static String binaryAdd2(String binary1, String binary2) {
final String validDigits = "01";
String binarySum = "";
// pad the binary strings with one more significant digit for carrying
String bin1 = '0' + binary1;
String bin2 = '0' + binary2;
// add them together starting from least significant digit
int index1 = bin1.length() - 1;
int index2 = bin2.length() - 1;
boolean carry = false;
while (index1 >= 0 || index2 >= 0) {
char char1 = bin1.charAt(index1 >= 0 ? index1 : 0);
char char2 = bin2.charAt(index2 >= 0 ? index2 : 0);
if (validDigits.indexOf(char1) < 0)
throw new NumberFormatException(binary1);
if (validDigits.indexOf(char2) < 0)
throw new NumberFormatException(binary2);
if (char1 == char2) {
binarySum = (carry ? '1' : '0') + binarySum;
carry = char1 == '1';
} else {
binarySum = (carry ? '0' : '1') + binarySum;
}
index1--;
index2--;
}
if (binarySum.length() > 1 && binarySum.charAt(0) == '0') {
binarySum = binarySum.substring(1);
}
String result = binarySum.toString();
return result;
}