2011-12-17 50 views
10

Có ai biết cách thêm 2 số nhị phân, được nhập dưới dạng nhị phân, trong Java không?Thêm số nhị phân

Ví dụ: 1010 + 10 = 1100.

+0

@twiddles Không gắn thẻ bài tập ở nhà nhiều hơn nữa! :) – squiguy

+0

Điều này có thể làm bạn phiền lòng. Bạn có thể viết mã C trong java. C là cấp thấp hơn và bạn có thể làm số học nhị phân với nó. Đã muộn rồi, vì vậy tôi không viết ra một mẫu, nhưng bạn có thể tra cứu nó. – user817129

Trả lời

29

Vâng, tôi biết cách thực hiện.

Sử dụng Integer.parseInt(String, int radix).

// 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; 
+0

wow. nó đã làm việc! cảm ơn bạn. nhưng tôi đã tự hỏi nếu bạn có thể giải thích tại sao? – PulsePanda

+0

'Integer' là một lớp, chứa một phương thức phân tích một chuỗi đại diện cho một số nguyên thành giá trị nguyên thực của nó (' int'). Bạn có thể xem liên kết tôi đã cung cấp cho bạn. –

+0

Martin - nó không hiển thị câu trả lời trong nhị phân. làm sao chúng ta làm việc đó bây giờ? –

12

Martijn là hoàn toàn đúng, để cõng và hoàn thành câu trả lời

Integer.toBinaryString(sum); 

sẽ cung cấp cho đầu ra của bạn trong hệ nhị phân theo các câu hỏi OP.

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

Cách tiếp cận thú vị nhưng dài khác là chuyển đổi từng số hai thành số thập phân, thêm số thập phân và chuyển đổi câu trả lời thu được về nhị phân!

17

Để tìm hiểu nguyên tắc cơ bản:

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

@Serhanbaker Bạn có thể giải thích, tổng + = s1.charAt (đầu tiên) -' 0 '; bit. Cảm ơn – kaila88

0

tôi đã cố gắng để làm cho nó đơn giản sth này là tôi đã phải đối phó với với mật mã của tôi prj của nó không hiệu quả, nhưng tôi hy vọng nó

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

Bạn có thể chỉ cần đặt 0b trước số nhị phân để xác định rằng đó là số nhị phân.

Đối với ví dụ này, bạn chỉ có thể làm:

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

này sẽ bổ sung thêm hai trong hệ nhị phân, và Integer.toString() với 2 như tham số thứ hai chuyển nó trở lại nhị phân.

+0

Các ký tự nhị phân được cho phép trong java 7, xem https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1 – fabian

+0

Đây phải là câu trả lời đúng ; không có lý do để chuyển đổi thành chuỗi hoặc cuộn giải pháp của riêng bạn. – Jason

0

đây là một phiên bản python mà

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] 
+5

Câu hỏi cụ thể nói 'Java'. –

0

Tôi đã thực sự quản lý để tìm một giải pháp cho câu hỏi này mà không sử dụng stringbuilder() chức năng. Check this out: giải pháp

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

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

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

} 
0

Một trong những cách đơn giản là như:

  1. chuyển đổi hai dây để char [] mảng và set carry = 0.
  2. thiết lập độ dài mảng nhỏ nhất trong vòng lặp for
  3. bắt đầu cho vòng lặp từ chỉ số cuối cùng và giảm nó
  4. séc 4 điều kiện (0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 10 (carry = 1)) để bổ sung nhị phân cho mỗi phần tử trong cả mảng và thiết lập lại việc mang theo cho phù hợp.
  5. thêm việc bổ sung trong StringBuffer
  6. append phần còn lại của các yếu tố từ mảng kích thước tối đa để StringBuffer nhưng kiểm tra xem xét thực hiện trong khi phụ
  7. in StringBuffer theo thứ tự ngược cho câu trả lời.

// Đoạn mã java là như

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

Các giải pháp ban đầu của Martijn sẽ không làm việc cho số nhị phân lớn. Các mã dưới đây có thể được sử dụng để khắc phục điều đó.

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

một chút giải thích được chào đón bằng mã. các câu trả lời chỉ mã có thể được gắn cờ là "chất lượng thấp" và bị xóa, ngay cả khi chúng có giá trị về mặt kỹ thuật. –

0

bạn có thể viết Một của riêng bạn.

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

nó hoạt động chỉ bằng con số, không có chuỗi nhu cầu, không cần xâu và ...

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


    } 

} 
+1

Tôi nghĩ rằng một chút giải thích cũng sẽ giúp ích – Valerica

Các vấn đề liên quan