Добавление двоичных чисел

Кто-нибудь знает, как добавить 2 двоичных числа, введенных как двоичные, в Java?

Например, 1010 + 10 = 1100.

Ответ 1

Используйте 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 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;
}

Ответ 2

Чтобы погрузиться в основы:

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);
}

Ответ 3

Martijn абсолютно правильна, чтобы контрейлеровать и завершить ответ

Integer.toBinaryString(sum);

даст ваш результат в двоичном формате в соответствии с вопросом OP.

Ответ 4

Вы можете просто поставить 0b перед двоичным номером, чтобы указать, что он двоичный.

В этом примере вы можете просто:

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

Это добавит двоичный код и Integer.toString() с 2, поскольку второй параметр преобразует его обратно в двоичный.

Ответ 5

Исходное решение 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();
}

Ответ 6

Еще один интересный, но длинный подход - преобразовать каждое из двух чисел в десятичное, добавив десятичные числа и преобразов ответ, полученный обратно в двоичный!

Ответ 7

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();

}

Ответ 8

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;
    }
}

Ответ 9

Я попытался сделать это простым, это было sth, с которым мне пришлось иметь дело с моей криптографией prj, но это не эффективно, но я надеюсь, что это будет

    public String binarysum(String a, String b){
    int carry=0;
    int maxim;
    int minim;
    maxim=Math.max(a.length(),b.length());
    minim=Math.min(a.length(),b.length());         
    char smin[]=new char[minim];
    char smax[]=new char[maxim];
    if(a.length()==minim){
     for(int i=0;i<smin.length;i++){
     smin[i]=a.charAt(i);
      }
      for(int i=0;i<smax.length;i++){
       smax[i]=b.charAt(i);
      }
      }
      else{
          for(int i=0;i<smin.length;i++){
          smin[i]=b.charAt(i);
             }
       for(int i=0;i<smax.length;i++){
       smax[i]=a.charAt(i);
      } 
      }
    char[]sum=new char[maxim];
    char[] st=new char[maxim];
    for(int i=0;i<st.length;i++){
    st[i]='0';
    }
    int k=st.length-1;
   for(int i=smin.length-1;i>-1;i--){
    st[k]=smin[i];
    k--;
    } 

     //   *************************** sum begins here
   for(int i=maxim-1;i>-1;i--){
   char x= smax[i];
   char y= st[i];
    if(x==y && x=='0'){
         if(carry==0)
             sum[i]='0';
         else if(carry==1){
             sum[i]='1';
             carry=0;
    }
   }
    else if(x==y && x=='1'){
        if(carry==0){
            sum[i]='0';
            carry=1;
        }
        else if(carry==1){
          sum[i]='1';
          carry=1;
        }
     }
     else if(x!=y){
        if(carry==0){
            sum[i]='1';
            }
        else if(carry==1){
          sum[i]='0';
          carry=1;
        }
       }        }
      String s=new String(sum);
     return s;
      }

Ответ 10

здесь версия python, которая

def binAdd(s1, s2):
    if not s1 or not s2:
        return ''

    maxlen = max(len(s1), len(s2))


    s1 = s1.zfill(maxlen)
    s2 = s2.zfill(maxlen)

    result  = ''
    carry   = 0

    i = maxlen - 1
    while(i >= 0):
        s = int(s1[i]) + int(s2[i])
        if s == 2: #1+1
            if carry == 0:
                carry = 1
                result = "%s%s" % (result, '0')
            else:
                result = "%s%s" % (result, '1')
        elif s == 1: # 1+0
            if carry == 1:
                result = "%s%s" % (result, '0')
            else:
                result = "%s%s" % (result, '1')
        else: # 0+0
            if carry == 1:
                result = "%s%s" % (result, '1')
                carry = 0   
            else:
                result = "%s%s" % (result, '0') 

        i = i - 1;

    if carry>0:
        result = "%s%s" % (result, '1')
    return result[::-1]

Ответ 11

Мне действительно удалось найти решение этого вопроса без использования функции 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]);
    }
}

Ответ 12

class Sum{
    public int number;
    public int carry;

    Sum(int number, int carry){
        this.number = number; 
        this.carry = carry;
    }
}

public String addBinary(String a, String b) {

    int lengthOfA = a.length();
    int lengthOfB = b.length();

    if(lengthOfA > lengthOfB){
        for(int i=0; i<(lengthOfA - lengthOfB); i++){
            b="0"+b;
        }
    }
    else{
         for(int i=0; i<(lengthOfB - lengthOfA); i++){
            a="0"+a;
        }
    }

    String result = "";
    Sum s = new Sum(0,0);
    for(int i=a.length()-1; i>=0; i--){
        s = addNumber(Character.getNumericValue(a.charAt(i)), Character.getNumericValue(b.charAt(i)), s.carry);
        result = result + Integer.toString(s.number);
    }

    if(s.carry == 1) { result += s.carry ;}

    return new StringBuilder(result).reverse().toString();
}

Sum addNumber(int number1, int number2, int carry){
        Sum sum = new Sum(0,0);
        sum.number = number1 ^ number2 ^ carry;
        sum.carry = (number1 & number2) | (number2 & carry) | (number1 & carry);

        return sum;
}

Ответ 13

import java.util.*;
public class BitAddition {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        int[] arr1 = new int[len];
        int[] arr2 = new int[len];
        int[] sum = new int[len+1];
        Arrays.fill(sum, 0);
        for(int i=0;i<len;i++){
            arr1[i] =sc.nextInt();
        }
        for(int i=0;i<len;i++){
            arr2[i] =sc.nextInt();
        }
        for(int i=len-1;i>=0;i--){
            if(sum[i+1] == 0){
                if(arr1[i]!=arr2[i]){
                    sum[i+1] = 1;
                }
                else if(arr1[i] ==1 && arr2[i] == 1){
                    sum[i+1] =0 ;
                    sum[i] = 1;
                }
            }
            else{
                if((arr1[i]!=arr2[i])){
                    sum[i+1] = 0;
                    sum[i] = 1;
                }
                else if(arr1[i] == 1){
                    sum[i+1] = 1;
                    sum[i] = 1;
                }
            }
        }
        for(int i=0;i<=len;i++){

        System.out.print(sum[i]);
        }
    }

}

Ответ 14

Один из простых способов:

  • преобразуйте две строки в массив char [] и установите перенос = 0.
  • установить наименьшую длину массива в цикле
  • начать цикл из последнего индекса и уменьшить его
  • проверить 4 условия (0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 10 (carry = 1)) для двоичного сложения для каждого элемента в обоих массивах и reset перенос соответственно.
  • добавить дополнение в stringbuffer
  • добавьте остальные элементы из массива максимального размера в stringbuffer, но проверьте, рассмотрите перенос при добавлении
  • print stringbuffer в обратном порядке для ответа.

//Код java имеет значение

static String binaryAdd(String a, String b){
    int len = 0;
    int size = 0;
    char[] c1 = a.toCharArray();
    char[] c2 = b.toCharArray();
    char[] max;


    if(c1.length > c2.length){
        len = c2.length;
        size = c1.length;
        max = c1;
    }       
    else
    {
        len = c1.length;
        size = c2.length;
        max = c2;
    }

    StringBuilder sb = new StringBuilder();
    int carry = 0;
    int p = c1.length - 1;
    int q = c2.length - 1;

    for(int i=len-1; i>=0; i--){
        if(c1[p] == '0' && c2[q] == '0'){
            if(carry == 0){
                sb.append(0);
                carry = 0;
            }   
            else{
                sb.append(1);
                carry = 0;
            }   
        }
        if((c1[p] == '0' && c2[q] == '1') || (c1[p] == '1' && c2[q] == '0')){
            if(carry == 0){
                sb.append(1);
                carry = 0;
            }   
            else{
                sb.append(0);
                carry = 1;
            }                   
        }
        if((c1[p] == '1' && c2[q] == '1')){
            if(carry == 0){
                sb.append(0);
                carry = 1;
            }   
            else{
                sb.append(1);
                carry = 1;
            }
        }
        p--;
        q--;
    }

    for(int j = size-len-1; j>=0; j--){
        if(max[j] == '0'){ 
            if(carry == 0){     
                sb.append(0);
                carry = 0;
            }   
            else{
                sb.append(1);
                carry = 0;
            }   
        }
        if(max[j] == '1'){
            if(carry == 0){     
                sb.append(1);
                carry = 0;
            }   
            else{
                sb.append(0);
                carry = 1;
            }   
        }           
    }
    if(carry == 1)
        sb.append(1);   
    return sb.reverse().toString();
}

Ответ 15

import java.io.; 
import java.util.; 
public class adtbin {
  static Scanner sc=new Scanner(System.in); 
   public void fun(int n1) {
      int i=0; 
      int sum[]=new int[20]; 
      while(n1>0) { 
        sum[i]=n1%2; n1=n1/2; i++; 
      } 
      for(int a=i-1;a>=0;a--) { 
          System.out.print(sum[a]); 
      }  
   } 
   public static void main() { 
     int m,n,add; 
     adtbin ob=new adtbin(); 
     System.out.println("enter the value of m and n"); 
     m=sc.nextInt(); 
     n=sc.nextInt(); 
     add=m+n; 
     ob.fun(add); 
   } 
}

Ответ 16

вы можете написать свой собственный.

long a =100011111111L;
long b =1000001111L;

int carry = 0 ;
long result = 0;

long multiplicity = 1;

while(a!=0 || b!=0 || carry ==1){
    if(a%10==1){
        if(b%10==1){
            result+= (carry*multiplicity);
            carry = 1;
        }else if(carry == 1){
            carry = 1;  
        }else{
            result += multiplicity;
        }
    }else if (b%10 == 1){
        if(carry == 1){
            carry = 1;
        }else {
            result += multiplicity; 
        }
    }else {
        result += (carry*multiplicity);
        carry = 0;
    }

    a/=10;
    b/=10;
    multiplicity *= 10;

}


System.out.print(result);

он работает только по номерам, не нуждается в строке, нет необходимости в подстроке и...

Ответ 17

package Assignment19thDec;

import java.util.Scanner;

public class addTwoBinaryNumbers {

    private static Scanner sc;

    public static void main(String[] args) {

        sc = new Scanner(System.in);
        System.out.println("Enter 1st Binary Number");
        int number1=sc.nextInt();
        int reminder1=0;
        int number2=sc.nextInt();
        int reminder2=0;
        int carry=0;
        double sumResult=0 ;int add = 0
        ;
        int n;
        int power=0;
        while (number1>0 || number2>0) {

            /*System.out.println(number1 + " " +number2);*/

            reminder1=number1%10;
            number1=number1/10;
            reminder2=number2%10;
            number2=number2/10;
            /*System.out.println(reminder1 +"  "+ reminder2);*/


            if(reminder1>1 || reminder2>1 ) {
                System.out.println("not a binary number");
                System.exit(0);
            }

            n=reminder1+reminder2+carry;
            switch(n) {

            case 0: 
                    add=0; carry=0;                                 
                    break;                  
            case 1: add=1; carry=0;
                    break;
            case 2: add=0; carry=1;
                    break;
            case 3: add=1;carry=1;
                    break;
            default: System.out.println("not a binary number ");

            }

            sumResult=add*(Math.pow(10, power))+sumResult;
            power++;


        }

        sumResult=carry*(Math.pow(10, power))+sumResult;
        System.out.println("\n"+(int)sumResult);


    }

}

Ответ 18

Идея та же, что обсуждалась в нескольких ответах, но это гораздо более короткое и более простое для понимания решение (шаги прокомментированы).

// Handles numbers which are way bigger.
public String addBinary(String a, String b) {
    StringBuilder sb = new StringBuilder();
    int i = a.length() - 1; 
    int j = b.length() -1;
    int carry = 0;
    while (i >= 0 || j >= 0) {
        int sum = carry;
        if (j >= 0) { sum += b.charAt(j--) - '0' };
        if (i >= 0) { sum += a.charAt(i--) - '0' };

        // Added number can be only 0 or 1
        sb.append(sum % 2);

        // Get the carry.
        carry = sum / 2;
    }

    if (carry != 0) { sb.append(carry); }

    // First reverse and then return.
    return sb.reverse().toString();
}

Ответ 19

Try this, tested with binary and decimal and its self explanatory

public String add(String s1, String s2, int radix){
        int s1Length = s1.length();
        int s2Length = s2.length();
        int reminder = 0;
        int carry = 0;
        StringBuilder result = new StringBuilder();
        int i = s1Length -1;
        int j = s2Length -1;
        while (i >=0 && j>=0) {
            int operand1 = Integer.valueOf(s1.charAt(i)+"");
            int operand2 = Integer.valueOf(s2.charAt(j)+"");
            reminder = (operand1+operand2+carry) % radix;
            carry = (operand1+operand2+carry) / radix;
            result.append(reminder);
            i--;j--;
        }
        while(i>=0){
            int operand1 = Integer.valueOf(s1.charAt(i)+"");
            reminder = (operand1+carry) % radix;
            carry = (operand1+carry) / radix;
            result.append(reminder);
            i--;
        }
        while(j>=0){
            int operand1 = Integer.valueOf(s2.charAt(j)+"");
            reminder = (operand1+carry) % radix;
            carry = (operand1+carry) / radix;
            result.append(reminder);
            j--;
        }
        return result.reverse().toString();
    }
}

Ответ 20

import java.util.Scanner;
{
    public static void main(String[] args) 
    {
        String b1,b2;
        Scanner sc= new Scanner(System.in);
        System.out.println("Enter 1st binary no. : ") ;
        b1=sc.next();
        System.out.println("Enter 2nd binary no. : ") ;
        b2=sc.next();
        int num1=Integer.parseInt(b1,2);
        int num2=Integer.parseInt(b2,2);
        int sum=num1+num2;
        System.out.println("Additon is : "+Integer.toBinaryString(sum));
    }

}