2016-09-14 6 views
9

나는 덧셈이나 곱셈법을 사용하여 곱셈을 구현하는 유명한 질문에 대해 잘 알고 있었는데, 루핑이나 비트 시프트의 알고리즘을 사용하고 시프트 된 비트 그룹 콤보를 추가했다.곱하기를 사용하여 덧셈을 구현하기

이제,

이 일부 알고리즘이 함께 달성 될 수있다 (감산 제외) 등 승산 구체적 또는 지수, 대수로만 높은 수준의 동작을 이용하여 또한 구현하기 위해 어떤 방법이 궁금 (비트 연산자를 어시스턴트로 사용하는 경우) 또는 공리로 사용되는 추가 작업이므로 정의 이외의 다른 방식으로는 재현 할 수 없습니까?

감사합니다. 물론

+8

이것은 수학 문제이며 프로그래밍과 관련이 없습니다. – nwellnhof

+0

Cauchy 제품에 대해 읽어보십시오. 어쩌면 힌트를 얻게 될 것입니다. – Monah

+0

저는 수학자가 아니지만 그런 것을 알지 못합니다. – duffymo

답변

7

예 :

a + b = ln(exp(a) * exp(b))

편집 : 더 투기에 위의 실용성 위에 내 눈을 리프팅, 난 당신이 더 높은 통해 낮은 레벨의 작업을 수행 할 수 있기를 기대한다고 말할 것 . 높은 수준의 작업이 낮은 수준의 작업으로 구축되는 한, 최소한 건물 스톤이 할 수있는 작업을 수행 할 수 있어야합니다. 그러나 쉽고 간단하지는 않지만 아마도 아래의 주석을보십시오. 인간은 1 + 1 = 2라고 말할 수 있지만 컴퓨터 나 더 단순한 장치에 물어 보는 것은 훨씬 저렴하고 안전합니다.

+4

실제 시스템에서 사용하면 오버플로 및 부정확 한 결과가 발생할 수 있습니다. – Leon

+0

실제로 구현 가능한 작업을 사용하려면 어떻게해야합니까? – harold

+1

음, ln()과 exp()는 물론 ln (exp (a) * exp (b))처럼 구현되지만, "추가하지 않고 구현 가능"을 의미하는 경우 기본적으로 수행하지 않고 추가를 수행하는 것에 대해 이야기하고 있습니다 부가. 정말 열심히해야합니다. –

2

글쎄, 만약 당신이 그것에 대해 두드러지기를 원한다면, 비트 연산자 인 OR, XOR, AND를 사용하여 2 진수 표현의 두 숫자를 정확히 "추가"하지 않고 합계 할 수 있습니다. 합 A + B = C를 들어, 제 n 비트는 다음과 같이 계산 될 수있다 :

C N N XOR 나른다 N XOR의 B를 =
반송 = (a N와 B N) OR ((A N XOR B를 N) 및 수행)

그리고 당신은 C를해야 비트를 반복 할 때 n ++을 사용하지 말고 적절한 측정을 위해 두 곱셈을 던져 넣으십시오 :

int add(int a, int b) { 
    int c = 0; 
    char carry = 0; 
    for (int mask = 1; mask; mask *= 2) { 
     char an = a & mask ? 1 : 0; 
     char bn = b & mask ? 1 : 0; 
     c |= (an^bn^carry) * mask; 
     carry = an & bn | (an^bn) & carry; 
    } 
    return c; 
} 
+1

충분히 지저분하지 않습니다. "엄격하게 추가"를 정의하십시오. (내가 말할 수있는 한, 당신이 비트 연산을 사용하여 설명하는 것은 실제로 컴퓨터가 실제로 + +를 쳤을 때와 닮았다.) –

+0

그것은 '곱셈 사용하기'/ ** only ** _higher 특히 곱셈과 같은 수준의 연산 또는 _ [초월]. – greybeard

+1

@greybeard 나는 "문자 그대로이 연산들 (그리고 가능하면 비트 연산자들)을 조합 한 알고리즘"을 매우 문자 적으로 :-) – m69