【问题标题】:Adding binary numbers添加二进制数
【发布时间】:2012-01-22 19:56:36
【问题描述】:

有谁知道如何在 Java 中添加 2 个二进制数,以二进制形式输入?

例如,1010 + 10 = 1100

【问题讨论】:

  • @twiddles 没有更多的作业标记! :)
  • 这可能会让你大吃一惊。你可以用java编写C代码。 C 是较低级别的,您可以用它进行二进制算术运算。来晚了,我就不写样例了,你可以查一下。

标签: java binary decimal addition


【解决方案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'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;
}

【讨论】:

  • 哇。有效!多谢兄弟。但我想知道你能不能解释一下原因?
  • Integer 是一个类,它包含一个将表示整数的字符串解析为其实整数值 (int) 的方法。你可以看看我提供给你的链接。
  • Martin - 它没有以二进制形式显示答案。我们该怎么做?
  • 此可以抛出java.lang.NumberFormatException:对于输入字符串: “10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101” “110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011”跨度>
  • @Tasneem 这很有意义,因为最大 int 值为 2,147,483,647 并且(第一个)二进制值转换为 24,847,893,154,024,981,730,169,397,005
【解决方案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);
}

【讨论】:

  • @Serhanbaker 你能解释一下吗? sum += s1.charAt(first) - '0';少量。谢谢
  • 这应该被接受,因为第一个答案不适用于大值
【解决方案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】:
    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;
        }
    }
    

    【讨论】:

      【解决方案7】:

      另一个有趣但冗长的方法是将两个数字中的每一个都转换为十进制,将十进制数字相加并将获得的答案转换回二进制!

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:
          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();
          }
          

          【讨论】:

            【解决方案10】:

            这个想法与一些答案中讨论的相同,但这个是一个更短且更容易理解的解决方案(步骤已注释)。

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

            【讨论】:

              【解决方案11】:

              我试图让它变得简单,这是我必须处理的密码学 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;
                    }
              

              【讨论】:

                【解决方案12】:

                这是一个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]
                

                【讨论】:

                • 问题具体说Java
                【解决方案13】:

                实际上,我已经设法在不使用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]);
                    }
                }
                

                【讨论】:

                  【解决方案14】:
                  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;
                  }
                  

                  【讨论】:

                    【解决方案15】:
                    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]);
                            }
                        }
                    
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      其中一种简单的方法是:

                      1. 将两个字符串转换为 char[] 数组并设置进位=0。
                      2. 在for循环中设置最小数组长度
                      3. 从最后一个索引开始 for 循环并递减它
                      4. 检查 4 个条件(0+0=0, 0+1=1, 1+0=1, 1+1=10(carry=1)) 对两个数组中的每个元素进行二进制加法并重置进位相应地。
                      5. 在字符串缓冲区中追加添加
                      6. 将其余元素从最大大小数组附加到字符串缓冲区,但在附加时检查是否考虑进位
                      7. 以相反的顺序打印字符串缓冲区以获得答案。

                      //java代码为as

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

                      【讨论】:

                        【解决方案17】:
                        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); 
                           } 
                        }
                        

                        【讨论】:

                        • 欢迎使用代码进行一些解释。仅代码的答案可能会被标记为“低质量”并被删除,即使它们在技术上是有效的。
                        【解决方案18】:

                        你可以自己写一个。

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

                        它只通过数字工作,不需要字符串,不需要 SubString 和 ...

                        【讨论】:

                          【解决方案19】:
                          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);
                          
                          
                              }
                          
                          }
                          

                          【讨论】:

                          • 我觉得稍微解释一下也会有帮助
                          【解决方案20】:
                          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();
                              }
                          }
                          

                          【讨论】:

                            【解决方案21】:
                            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));
                                }
                            
                            }
                            
                            

                            【讨论】:

                            • 请在您的答案中添加详细信息
                            猜你喜欢
                            • 2014-09-26
                            • 1970-01-01
                            • 2017-03-14
                            • 2022-01-04
                            • 2015-02-01
                            • 1970-01-01
                            • 2015-04-07
                            • 2012-03-10
                            • 1970-01-01
                            相关资源
                            最近更新 更多