添加二进制数

22

有人知道如何在Java中以二进制形式输入两个二进制数并将它们相加吗?

例如,1010 + 10 = 1100


@twiddles 不再需要作业标记了! :) - squiguy
这可能会让你大吃一惊。你可以在Java中编写C代码。C是较低级别的语言,您可以使用它进行二进制算术运算。现在已经很晚了,所以我不会写一个示例,但您可以查找它。 - user817129
这更可能是一道LeetCode的问题。我在这里遇到了这个问题:https://leetcode.com/problems/add-binary/ - Prometheus
22个回答

56

使用Integer.parseInt(String, int radix)方法。

 public static String addBinary(){
 // The two input Strings, containing the binary representation of the two values:
    String input0 = "1010";
    String input1 = "10";

    // Use as radix 2 because it's binary    
    int number0 = Integer.parseInt(input0, 2);
    int number1 = Integer.parseInt(input1, 2);

    int sum = number0 + number1;
    return Integer.toBinaryString(sum); //returns the answer as a binary value;
}

哇,它成功了!谢谢兄弟。但我想知道为什么? - PulsePanda
Integer是一个类,其中包含一种方法,用于将表示整数的字符串解析为其真实的整数值(int)。您可以查看我提供给您的链接。 - Martijn Courteaux
Martin - 它没有显示二进制答案。我们该怎么做? - Abhishek kumar
@Abhishekkumar 只需使用 Integer.toBinaryString(sum); - austin665
13
这可能会引发 java.lang.NumberFormatException 异常: 输入字符串为:"10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101" "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011" - Tasneem
3
@Tasneem这是有道理的,因为最大的整数值是2,147,483,647,而第一个二进制值转换为24,847,893,154,024,981,730,169,397,005 - Ivar Reukers

32

深入了解基础知识:

public static String binaryAddition(String s1, String s2) {
    if (s1 == null || s2 == null) return "";
    int first = s1.length() - 1;
    int second = s2.length() - 1;
    StringBuilder sb = new StringBuilder();
    int carry = 0;
    while (first >= 0 || second >= 0) {
        int sum = carry;
        if (first >= 0) {
            sum += s1.charAt(first) - '0';
            first--;
        }
        if (second >= 0) {
            sum += s2.charAt(second) - '0';
            second--;
        }
        carry = sum >> 1;
        sum = sum & 1;
        sb.append(sum == 0 ? '0' : '1');
    }
    if (carry > 0)
        sb.append('1');

    sb.reverse();
    return String.valueOf(sb);
}

4
@Serhanbaker,请解释一下 sum += s1.charAt(first) - '0'; 这行代码中的 bit 是什么意思。 - kaila88
2
此答案应该被接受,因为第一个答案在处理大数值时无法正常工作。 - rahimli

13

Martijn是完全正确的,为了接着他的话并且完善答案

Integer.toBinaryString(sum);

按照原始问题,这将以二进制形式输出您的输出。


9

你可以在二进制数字前加上0b来指定它是二进制。

对于这个例子,你可以简单地进行如下操作:

Integer.toString(0b1010 + 0b10, 2);

这将以二进制形式添加两个数字,使用Integer.toString()方法,并将2作为第二个参数传入,可以将其转换回二进制形式。


1
Java 7也允许使用二进制字面量,详见https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1。 - fabian
这应该是正确的答案;没有理由将其转换为字符串或自己编写解决方案。 - Jason

6

Martijn提供的原始解决方案对于大型二进制数字不起作用。可以使用下面的代码来克服这个问题。

public String addBinary(String s1, String s2) {
    StringBuilder sb = new StringBuilder();
    int i = s1.length() - 1, j = s2.length() -1, carry = 0;
    while (i >= 0 || j >= 0) {
        int sum = carry;
        if (j >= 0) sum += s2.charAt(j--) - '0';
        if (i >= 0) sum += s1.charAt(i--) - '0';
        sb.append(sum % 2);
        carry = sum / 2;
    }
    if (carry != 0) sb.append(carry);
    return sb.reverse().toString();
}

它对我来说可以处理大的二进制数。 - Santosh Kumar

2

另一种有趣但较长的方法是将这两个数字转换为十进制,将十进制数相加,然后将得到的答案转换回二进制!


2

Java解决方案

static String addBinary(String a, String b) {

    int lenA = a.length();
    int lenB = b.length();
    int i = 0;

    StringBuilder sb = new StringBuilder();
    int rem = Math.abs(lenA-lenB);
    while(rem >0){
        sb.append('0');
        rem--;
    }
    if(lenA > lenB){
        sb.append(b);  
        b = sb.toString();
    }else{
        sb.append(a);
        a = sb.toString();
    }

    sb = new StringBuilder();
    char carry = '0';
    i = a.length();
    while(i > 0){
        if(a.charAt(i-1) == b.charAt(i-1)){
            sb.append(carry);
            if(a.charAt(i-1) == '1'){
                carry = '1';
            }else{
                carry = '0';
            }
        }else{
            if(carry == '1'){
                sb.append('0');
                carry = '1';
            }else{
                carry = '0';
                sb.append('1');
            }
        }
        i--;
    }

    if(carry == '1'){
        sb.append(carry);
    }

    sb.reverse();
    return sb.toString();

}

2
public String addBinary(String a, String b) { 
    int carry = 0;
    StringBuilder sb = new StringBuilder();
    for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0;i--,j--){
        int sum = carry + (i >= 0 ? a.charAt(i) - '0':0) + (j >= 0 ? b.charAt(j) - '0' : 0);
        sb.append(sum%2);
        carry =sum / 2;
    }
    if(carry > 0) sb.append(carry);
    sb.reverse();
    return sb.toString();
}

2
public class BinaryArithmetic {

    /*-------------------------- add ------------------------------------------------------------*/
    static String add(double a, double b) {
        System.out.println(a + "first val :" + b);
        int a1 = (int) a;
        int b1 = (int) b;
        String s1 = Integer.toString(a1);
        String s2 = Integer.toString(b1);
        int number0 = Integer.parseInt(s1, 2);
        int number1 = Integer.parseInt(s2, 2);

        int sum = number0 + number1;
        String s3 = Integer.toBinaryString(sum);

        return s3;
    }
    /*-------------------------------multiply-------------------------------------------------------*/

    static String multiply(double a, double b) {
        System.out.println(a + "first val :" + b);
        int a1 = (int) a;
        int b1 = (int) b;
        String s1 = Integer.toString(a1);
        String s2 = Integer.toString(b1);
        int number0 = Integer.parseInt(s1, 2);
        int number1 = Integer.parseInt(s2, 2);

        int sum = number0 * number1;
        String s3 = Integer.toBinaryString(sum);

        return s3;
    }
    /*----------------------------------------substraction----------------------------------------------*/

    static String sub(double a, double b) {
        System.out.println(a + "first val :" + b);
        int a1 = (int) a;
        int b1 = (int) b;
        String s1 = Integer.toString(a1);
        String s2 = Integer.toString(b1);
        int number0 = Integer.parseInt(s1, 2);
        int number1 = Integer.parseInt(s2, 2);

        int sum = number0 - number1;
        String s3 = Integer.toBinaryString(sum);

        return s3;
    }

    /*--------------------------------------division------------------------------------------------*/
    static String div(double a, double b) {
        System.out.println(a + "first val :" + b);
        int a1 = (int) a;
        int b1 = (int) b;
        String s1 = Integer.toString(a1);
        String s2 = Integer.toString(b1);
        int number0 = Integer.parseInt(s1, 2);
        int number1 = Integer.parseInt(s2, 2);

        int sum = number0 / number1;
        String s3 = Integer.toBinaryString(sum);

        return s3;
    }
}

1

我实际上已经找到了一种解决这个问题的方法,而不使用 stringbuilder() 函数。看看这个:

public void BinaryAddition(String s1,String s2)
{
    int l1=s1.length();int c1=l1;
    int l2=s2.length();int c2=l2;
    int max=(int)Math.max(l1,l2);
    int arr1[]=new int[max];
    int arr2[]=new int[max];
    int sum[]=new int[max+1];
    for(int i=(arr1.length-1);i>=(max-l1);i--)
    {
        arr1[i]=(int)(s1.charAt(c1-1)-48);
        c1--;
    }
    for(int i=(arr2.length-1);i>=(max-l2);i--)
    {
        arr2[i]=(int)(s2.charAt(c2-1)-48);
        c2--;
    }
    for(int i=(sum.length-1);i>=1;i--)
    {
        sum[i]+=arr1[i-1]+arr2[i-1];
        if(sum[i]==2)
        {
            sum[i]=0;
            sum[i-1]=1;
        }
        else if(sum[i]==3)
        {
            sum[i]=1;
            sum[i-1]=1;
        }
    }
    int c=0;
    for(int i=0;i<sum.length;i++)
    {
        System.out.print(sum[i]);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接