如何使用两个二进制字符串,返回它们的总和(也是一个二进制字符串)

时间:2016-06-16 09:08:19

标签: java data-structures

示例:

a =“100”

b =“11”

返回a + b =“111”。

通过解析int完成它,但当两个字符串超过int大小时,它将无法工作。

我试了很长时间:

long a1=Long.parseLong(a,2);
long b1=Long.parseLong(b,2);
long sum=a1+b1;
String ans=Long.toBinaryString(sum);

有没有任何双重方法?

5 个答案:

答案 0 :(得分:1)

要超过long尺寸,您需要BigInteger

public void test() {
    String a = "100";
    String b = "11";
    BigInteger bA = new BigInteger(a, 2);
    BigInteger bB = new BigInteger(b, 2);
    System.out.println(a + " + " + b + " = " + bA.add(bB).toString(2));
}

但这对double没有帮助。

答案 1 :(得分:0)

对于双倍,你可以试试这个:

double number = 2.2;
Long.toBinaryString(Double.doubleToLongBits(number));

答案 2 :(得分:0)

https://stackoverflow.com/a/8272792/6049590

从上方复制和修改

public double ConvertToDouble(string str){
    long v = 0;
    for (int i = str.Length - 1; i >= 0; i--) v = (v << 1) + (str[i] - '0');
    return = BitConverter.ToDouble(BitConverter.GetBytes(v), 0);
}

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0ff76c9a-8d8c-46f3-94cc-420f719a14e4/how-to-convert-floatdoubleulong-into-binaryotcalhex-string?forum=netfxbcl

从上方复制和修改

public string ConvertToString(double value){
    string s = String.Empty;

    foreach (byte b in BitConverter.GetBytes(value))
    {
       s += Convert.ToString(b,2).PadLeft(8,'0'); // for hex. For binary, use 2 and 8. For octal, use 8 and 3
    }
    return s;
}

现在是最后一个:

double c = ConvertToDouble(a) + ConvertToDouble(b);
string bitString = ConvertToString(c);

string bitString 应该是您的预期结果。

答案 3 :(得分:0)

添加然后再次转换字符串:

public String XXX()
{ 
    int a = Double.parseDouble("100.0");
    int b = Double.parseDouble("11.0");

    return (a + b) + "";
}

添加然后返回:

public double XXX()
{ 
    int a = Double.parseDouble("100.0");
    int b = Double.parseDouble("11.0");

    return (a + b);
}

度过美好的一天!

答案 4 :(得分:0)

如果字符串太长而无法容纳任何标准类型且您不想使用BigInteger,那么您可以使用添加时使用的相同算法以老式方式执行此操作手写两个数字,在纸上。

例如,如果你有&#34; 110&#34;和&#34; 11&#34;,你会写:

 110
+ 11
----

然后从右边开始向左移动,添加数字。您的第一个部分结果是&#34; 1&#34;,在右侧栏中:

 110
+ 11
----
   1

接下来,&#34; 1&#34;和&#34; 1&#34;是&#34; 0&#34;,带有&#34; 1&#34;。所以你写了&#34; 0&#34;并注意你有一个随身携带。你的部分结果是&#34; 01&#34;,随身携带。

在第三列中添加&#34; 1&#34;随身携带,再次给你&#34; 0&#34;随身携带。你的部分结果是&#34; 001&#34;和携带。在第四列中,您可以添加进位,为您提供最终结果,&#34; 1001&#34;。

要在代码中执行此操作,最简单的方法是使用&#34; 0&#34;填充较短的数字。在左侧,使其长度与较长的数字相同。所以在上面的例子中我会转向&#34; 11&#34;进入&#34; 011&#34;。然后编写一个循环,从右到左处理字符串。我不是Java程序员,但你应该能够从这个伪代码中获得想法。

number1 = "110"
number2 = "011"
result = ""
carry = 0
for i = length(number1) downto 0
    digit1 = number1[i].ToInt()
    digit2 = number2[i].ToInt()
    sum = digit1 + digit2 + carry
    if (sum % 2) == 0
        result = result + "0"
    else
        result = result + "1"
    carry = (result > 1)
end for
if (carry = 1)
    result = result + "1"

这是缓慢而简单的方法。您可以使用该方法的变体来更快地完成此操作。基本上,你一次取32位(从右到左),做加法,输出结果32位,保持进位(如果有的话),然后向左移动。您可以使用字节,单词,整数或长整数来执行此操作。假设您使用字节进行操作,并且您的数字是&#34; 010101010101010101010101&#34;和&#34; 10110100110101001111&#34;。您可以将它们分成8位组:

    3       2        1
01010101 01010101 01010101
10110100 11010100 11111100

从组1中抓取两个字节,将它们转换为int,添加它们,然后输出结果的前8位。如果结果有第九位(不能超过9位),则它进入下一列数字。

继续,直到您完成最后一列数字。正如我所说,你可以使用任何整数类型(byte,short,int,long)来加速我为各个位设置的基本算法。