2012-09-09 6 views
0

나는 이진수를 함께 곱셈/나눗셈/덧셈/뺄셈을 할 수있는 프로그램을 만들고 있습니다. 내 프로그램에서 모든 정수를 숫자 벡터로 나타내야합니다.바이너리로 주어진 두 정수 곱하기

나는 이것을 덧붙여서 어떻게하는지 알아 냈지만, 곱셈은 나를 비틀 렸습니다. 누군가이 프로그램의 지침으로 의사 코드를 얻는 방법에 대해 조언을 해줄 수 있는지 궁금합니다.

미리 감사드립니다.

편집 : 나는 곱셈을위한 알고리즘을 생성하는 방법을 알아 내려고하고 있습니다. 이 알고리즘을 이해하는 방법에 대한 도움을 주시면 감사하겠습니다. 나는 보통 C++에서 작동하지 않으므로, 그걸로 생각해 내기까지 조금 더 걸린다.

+0

이진수를 나눌 수 있습니까? – cprogcr

+3

초등 학교에서 10 진수로 다시 곱셈과 긴 나누기를 어떻게 배웠는지 생각해보십시오. 바이너리에서도 같은 원칙을 사용할 수 있습니다. 연필과 종이로 먼저 시도해보십시오. 알고리즘을 이해했는지 확인한 다음 코드를 작성하십시오. –

답변

3

당신이 번식하려는 경우 당신은 또한 부스의 알고리즘을 고려할 수 :

+0

곱셈 코드의 일부로 곱셈을 사용하지 않으려면 부스를 사용하십시오. – johnwbyrd

0

binary multiplier 또는 CPU에서 사용되는 다른 회로를 시뮬레이트 해 볼 수 있습니다.

vector<digit> x; 
vector<digit> y; 

total = 0; 
multiplier = 1; 
for i = x->last -> x->first //start off with the least significant digit of x 
    total = total + i * y * multiplier 
    multiplier *= 10; 

return total 
2

의사의 긴 곱셈는 같은 보일 것 Booth's multiplication algorithm

+0

흠 .. x-> last-> x-> first로 무엇을 의미하는지 설명해 주시겠습니까? – Valrok

+0

@Julian은'x'의 마지막 자릿수에서 시작하여 처음까지 작동합니다. 따라서 숫자 '156'은 'i = 6', 그 다음은 5, 그 다음은 1로 시작합니다. –

0

그냥 시도 뭔가를,이는 것 이진수로 부호없는 값을 곱하는 경우에만 작동합니다.

unsigned int multiply(unsigned int left, unsigned int right) 
{ 
    unsigned long long result = 0; //64 bit result 

    unsigned int R = right; //32 bit right input 
    unsigned int M = left; //32 bit left input 

    while (R > 0) 
    { 
     if (R & 1) 
     {// if Least significant bit exists 
      result += M; //add by shifted left 
     } 
     R >>= 1; 
     M <<= 1; //next bit 
    } 

/*-- if you want to check for multiplication overflow: -- 
    if ((result >> 32) != 0) 
    {//if has more than 32 bits 
     return -1; //multiplication overflow 
    }*/ 

    return (unsigned int)result; 
} 

그러나, 그것의 이진 수준에있어 ... 난 그냥 입력으로 숫자의 벡터가