Agregar números binarios

¿Alguien sabe cómo agregar 2 números binarios, ingresados ​​como binarios, en Java?

Por ejemplo, 1010 + 10 = 1100 .

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

Para sumergirse en los fundamentos:

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

Martijn tiene toda la razón, para aprovechar y completar la respuesta

 Integer.toBinaryString(sum); 

daría su salida en binario según la pregunta OP.

Puede poner 0b delante del número binario para especificar que es binario.

Para este ejemplo, simplemente puede hacer:

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

Esto agregará los dos en binario, e Integer.toString () con 2, ya que el segundo parámetro lo convierte nuevamente en binario.

Otro enfoque interesante pero largo es convertir cada uno de los dos números a decimal, sumndo los números decimales y convirtiendo la respuesta obtenida de nuevo en binario.

Solución 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(); } 

La solución original de Martijn no funcionará para números binarios grandes. El siguiente código se puede usar para superar eso.

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

Intenté simplificar esto, tuve que lidiar con mi criptografía. No es eficiente, pero lo espero.

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

aquí hay una versión de Python que

 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] 

De hecho, he logrado encontrar una solución a esta pregunta sin usar la función stringbuilder() . Mira esto:

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

Una de las formas simples es como:

  1. convierta las dos cadenas a la matriz char [] y establezca carry = 0.
  2. establecer la menor longitud del conjunto en bucle for
  3. iniciar para el ciclo desde el último índice y disminuirlo
  4. compruebe 4 condiciones (0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 10 (acarreo = 1)) para la adición binaria de cada elemento en ambas matrices y reinicie el acarreo en consecuencia.
  5. anexar la adición en stringbuffer
  6. Anexar el rest de los elementos de la matriz de tamaño máximo a la acción de cadena, pero verifique llevar mientras se agrega
  7. imprime stringbuffer en orden inverso para la respuesta.

// El código de Java es como

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

puedes escribir tu propio Uno.

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

funciona solo por números, no necesita cadena, no necesita SubString y …

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