我使用以下代码进行二元求和:
class dump{
public static void main(String[] args){
final int number0 = Integer.parseInt("000", 2);
final int number1 = Integer.parseInt("1", 2);
final int sum = number0 + number1;
System.out.println(Integer.toBinaryString(sum));
}
}
问题是我没有得到答案的准确精确度 - 例如000 + 1或00 + 1都决定回答为1.
由于我打算将结果用作散列映射中的键,因此结果的非唯一性是个问题
如何获得00 + 1 => 01或000 + 1 => 001。
答案 0 :(得分:2)
问题在于我没有得到答案的确切精确度
无效的前导零对答案的准确性没有影响:答案1
与001
或00000000000001
完全一样精确 - 它是相同的数字。
由于我打算将结果用作散列映射中的键,因此结果的非唯一性是个问题。
如果您将这样的字符串用作有序映射中的键,那将是一个问题,因为键有时会出现乱序。在哈希映射中,它不是问题,因为Integer.toBinaryString(sum)
将丢弃所有数字中的前导零,因此您永远不会看到由您的过程生成的000
之类的数字。如果这些数字来自外部,您可以通过解析并转换为二进制来规范化它们,然后再将它们用作哈希键。
答案 1 :(得分:0)
我理解你的问题的方法是你想要“000”+“1”变成“001”,而“00010”+“10”变成“00100”。即使我可以质疑你在这里尝试做的是正确,正确还是正确的方法。我只会尝试为你解决问题:
您需要检查输入的长度,然后附加足够的零。
public static String binSum(String a, String b) {
final int number0 = Integer.parseInt(a, 2);
final int number1 = Integer.parseInt(b, 2);
final int sum = number0 + number1;
String result = Integer.toBinaryString(sum);
while (result.length() < Math.max(a.length(), b.length())) result = "0" + result;
return result;
}
System.out.println(binSum("000", "1")); // 001
System.out.println(binSum("0000", "1")); // 0001
System.out.println(binSum("10", "10")); // 100
答案 2 :(得分:0)
java.lang.Integer.toBinaryString()
方法返回二进制(基数2)中参数表示的无符号整数值的字符串表示形式。
System.out.println("Binary is " + Integer.toBinaryString(170));
输出是:
Binary is 10101010
建议使用其他一些技术从整数输入生成唯一字符串。
例如,您可以使用编码字符串,如下所示:
byte[] encodedBytes = Base64.encodeBase64(new String(sum).getBytes());
System.out.println("Key " + new String(encodedBytes));
答案 3 :(得分:0)
您需要在所有二进制数中保存最大长度。如果你想,可以动态。以下可能会给你一个想法。
final int number0 = Integer.parseInt("000", 2);
final int number1 = Integer.parseInt("1", 2);
final int sum = number0 + number1;
int len = 3;
String output = String.format("%" + len + "s", Integer.toBinaryString(sum))
.replace(' ', '0');
System.out.println(output); // 001