0

我正在使用以下代码进行二进制求和:

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。

4

4 回答 4

2

问题是我没有得到答案的确切精度

微不足道的前导零对答案的精度没有影响:答案与or1完全相同- 它是相同的数字。00100000000000001

由于我打算将结果用作 hashmap 中的键,因此结果的非唯一性是一个问题。

如果您将这样的字符串用作排序映射中的键,那将是一个问题,因为键有时会出现乱序。在哈希映射中,这不是问题,因为Integer.toBinaryString(sum)会在所有数字中删除前导零,因此您永远不会看到000您的程序生成的数字。如果这些数字确实来自外部,您可以在将它们用作哈希键之前通过解析并转换为二进制来规范化它们。

于 2013-08-23T13:07:47.017 回答
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
于 2013-08-23T13:07:31.367 回答
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));
于 2013-08-23T13:11:56.433 回答
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
于 2013-08-23T13:17:11.153 回答