2010-03-09 5 views
5

이진 산술은 간단하지만 초보 프로그래머로서 이진수의 더하기, 빼기, 곱하기 및 나눗셈을위한 알고리즘을 생각해 내기 란 다소 어렵습니다.Java에서 이진 산술을위한 알고리즘

두 개의 이진수가 문자열로 저장되어 있고 앞에 0이없는 것으로 가정합니다. 두 숫자에 대해 이러한 작업을 수행하려면 어떻게해야합니까?

편집 : int 또는 long으로 변환하지 않아야합니다.

+1

실제 알고리즘을 구현하는 방법이나 이러한 문자열로 산술 연산을 수행하는 방법에 대해 배우고 싶습니까? – Daff

+2

http://stackoverflow.com/questions/1218149/arbitrary-precision-arithmetic-explanation – paxdiablo

+0

Daff, 알고리즘을 구현하는 방법을 배우고 싶습니다. –

답변

4

다음 코드는 실제로 산술, 바이너리 또는 기타 작업을 수행하지 않고 이진 추가를 구현합니다. 실제 "추가"는 lookupTable에 의해 수행되며 그 밖의 모든 작업은 곧은 문자열 조작입니다. 나는 효율성 대신 프로세스를 강조하면서 가능한 한 유익한 것으로 만들기위한 의도로 작성했습니다. 희망이 도움이됩니다. 우리가에있는 동안

public class BinaryArithmetic { 
    static String[] lookupTable = { 
     "0+0+0=00", 
     "0+0+1=01", 
     "0+1+0=01", 
     "0+1+1=10", 
     "1+0+0=01", 
     "1+0+1=10", 
     "1+1+0=10", 
     "1+1+1=11", 
    }; 
    static String lookup(char b1, char b2, char c) { 
     String formula = String.format("%c+%c+%c=", b1, b2, c); 
     for (String s : lookupTable) { 
      if (s.startsWith(formula)) { 
       return s.substring(s.indexOf("=") + 1); 
      } 
     } 
     throw new IllegalArgumentException(); 
    } 
    static String zeroPad(String s, int length) { 
     while (s.length() < length) { 
      s = "0" + s; 
     } 
     return s; 
    } 
    static String add(String s1, String s2) { 
     int length = Math.max(s1.length(), s2.length()); 
     s1 = zeroPad(s1, length); 
     s2 = zeroPad(s2, length); 
     String result = ""; 
     char carry = '0'; 
     for (int i = length - 1; i >= 0; i--) { 
      String columnResult = lookup(s1.charAt(i), s2.charAt(i), carry); 
      result = columnResult.charAt(1) + result; 
      carry = columnResult.charAt(0); 
     } 
     if (carry == '1') { 
      result = carry + result; 
     } 
     return result; 
    } 
    public static void main(String args[]) { 
     System.out.println(add("11101", "1001")); 
    } 
} 

, 나뿐만 아니라 너무 multiply을 할 수 있습니다.

static String multiply(String s1, String s2) { 
    String result = ""; 
    String zeroSuffix = ""; 
    for (int i = s2.length() - 1; i >= 0; i--) { 
     if (s2.charAt(i) == '1') { 
      result = add(result, s1 + zeroSuffix); 
     } 
     zeroSuffix += "0"; 
    } 
    return result; 
} 
11

진 문자열을 int로 :

int i = Integer.parseInt("10101011", 2); 
int j = Integer.parseInt("00010", 2); 

이 그럼 당신은 예를 들어, 당신은 두 가지의 int로 기쁘게 아무것도 수행 할 수 있습니다

i = i + j; 
i = i - j; 

을 그리고 바이너리 문자열로 다시 얻을 :

String s = Integer.toBinaryString(i); 
+0

죄송합니다. int 또는 long으로 변환하지 않도록주의해야합니다. –

1

이진 문자열을 정수로 변환 한 다음 정수 (예 : 위키

String add(String s1, String s2) { 
    int i1 = Integer.parseInt(s1); 
    int i2 = Integer.parseInt(s2); 
    return Integer.toBinaryString(i1 + i2); 
} 
5

알고리즘 :

추 이진 간단한 산술 연산이 첨가

이다. 1 에 추가되어야 할 것이다 동안 디지트 "0"

0 + 0 → 0 
0 + 1 → 1 
1 + 0 → 1 
1 + 1 → 0, carry 1 (since 1 + 1 = 0 + 1 × 10 in binary) 

두 개의 "1"로 자리 추가 낸다 두 한자리 이진수 추가 행하는 형태를 사용 비교적 간단 다음 열.

뺄셈 :

빼기가 훨씬에서 같은 방식으로 작동합니다

0 − 0 → 0 
0 − 1 → 1, borrow 1 
1 − 0 → 1 
1 − 1 → 0 

"0" 자리에서 "1"숫자를 빼면는 자리를 생산 "1 "이고, 다음 열 에서 1 을 뺍니다. 이것은 차입으로 알려져 있습니다. 운반은 원칙적으로 입니다. 뺄셈의 결과가 0보다 작 으면 숫자의 가능한 값이 최소 일 때 절차는 적자 을 기수 (즉, 10/10)로 나눈 적자를 "차용하여"왼쪽에서 뺍니다 그것은 다음 위치 값에서.

곱셈 : 바이너리

곱셈은 의 진수 대응과 유사하다. 설정된 개수 와 B가 부분 제품 곱해질 수있다 : B의 ​​각 디지트를 들어,에 해당 자리의 제품 계산하고 새로운 행 작성 는 좌측 시프트 지도록 우측 디지트 라인 위로 B 의 숫자가 사용되었습니다. 이 모든 부분 제품의 합계는 최종 이됩니다. 다음과 같이 승산 예

* If the digit in B is 0, the partial product is also 0 
* If the digit in B is 1, the partial product is equal to A 

, 이진수 1011 1010 : 이진 두 자리가 있으므로

오직 두 가지 각 부분 승산 결과가있다

 

      1 0 1 1 (A) 
      × 1 0 1 0 (B) 
      --------- 
      0 0 0 0 ← Corresponds to a zero in B 
    +  1 0 1 1  ← Corresponds to a one in B 
    + 0 0 0 0 
    + 1 0 1 1  
    --------------- 
    = 1 1 0 1 1 1 0 
0

내장 BitSet 클래스 우리에게 매우 직선적이다 비트 레벨 연산을위한 e.

2

이진 산술 작업은의 예를 따라서

    (1)  (1) 
182  182  182  182  182 
845  845  845  845  845 
--- + --- + --- + --- + --- + 
      7  27  027  1027 

당신이 무슨 짓을 한거야에 대한 추가하자 더 익숙한베이스 (10)에 비해 정말 다르지 않다? 추가 할 숫자를 오른쪽 정렬하고 오른쪽에서 왼쪽으로 진행하여 한 번에 하나의 숫자를 추가하고 필요에 따라 왼쪽으로 +1을 넘깁니다.

바이너리에서 프로세스는 완전히 동일합니다. 사실, 이제는 2 자리 "0"과 "1"을 갖기 때문에 더 간단합니다!

   (1)       (1)  (1) 
11101  11101  11101  11101  11101  11101  11101 
1001  1001  1001  1001  1001  1001  1001 
----- + ----- + ----- + ----- + ----- + ----- + ----- + 
       0   10  110  0110  00110  100110 

작업의 나머지 부분은 너무 유사하게 작동 : 당신이 기본 10 사용하는 것과 동일한 과정은 기본 2 작동 만이 "숫자"0과 1이 있기 때문에 다시, 실제로는 간단합니다. 하드웨어가 이진 시스템을 좋아하는 이유는이 단순성 때문입니다.

관련 문제