이진 산술은 간단하지만 초보 프로그래머로서 이진수의 더하기, 빼기, 곱하기 및 나눗셈을위한 알고리즘을 생각해 내기 란 다소 어렵습니다.Java에서 이진 산술을위한 알고리즘
두 개의 이진수가 문자열로 저장되어 있고 앞에 0이없는 것으로 가정합니다. 두 숫자에 대해 이러한 작업을 수행하려면 어떻게해야합니까?
편집 : int 또는 long으로 변환하지 않아야합니다.
이진 산술은 간단하지만 초보 프로그래머로서 이진수의 더하기, 빼기, 곱하기 및 나눗셈을위한 알고리즘을 생각해 내기 란 다소 어렵습니다.Java에서 이진 산술을위한 알고리즘
두 개의 이진수가 문자열로 저장되어 있고 앞에 0이없는 것으로 가정합니다. 두 숫자에 대해 이러한 작업을 수행하려면 어떻게해야합니까?
편집 : int 또는 long으로 변환하지 않아야합니다.
다음 코드는 실제로 산술, 바이너리 또는 기타 작업을 수행하지 않고 이진 추가를 구현합니다. 실제 "추가"는 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;
}
진 문자열을 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);
죄송합니다. int 또는 long으로 변환하지 않도록주의해야합니다. –
이진 문자열을 정수로 변환 한 다음 정수 (예 : 위키
String add(String s1, String s2) {
int i1 = Integer.parseInt(s1);
int i2 = Integer.parseInt(s2);
return Integer.toBinaryString(i1 + i2);
}
알고리즘 :
추 이진 간단한 산술 연산이 첨가
이다. 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
내장 BitSet 클래스 우리에게 매우 직선적이다 비트 레벨 연산을위한 e.
이진 산술 작업은의 예를 따라서
(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이 있기 때문에 다시, 실제로는 간단합니다. 하드웨어가 이진 시스템을 좋아하는 이유는이 단순성 때문입니다.
실제 알고리즘을 구현하는 방법이나 이러한 문자열로 산술 연산을 수행하는 방법에 대해 배우고 싶습니까? – Daff
http://stackoverflow.com/questions/1218149/arbitrary-precision-arithmetic-explanation – paxdiablo
Daff, 알고리즘을 구현하는 방법을 배우고 싶습니다. –