具有精确精度的二进制求和

时间:2013-08-23 13:03:15

标签: java binary

我使用以下代码进行二元求和:

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 个答案:

答案 0 :(得分:2)

  

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

无效的前导零对答案的准确性没有影响:答案100100000000000001完全一样精确 - 它是相同的数字。

  

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

如果您将这样的字符串用作有序映射中的键,那将是一个问题,因为键有时会出现乱序。在哈希映射中,它不是问题,因为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