2010-07-13 2 views
1
#include <iostream> 
using namespace std; 
int mulths(int u,int v) 
{ 
    unsigned u0,v0,w0; 
    int u1,v1,w1,w2,t; 

    u0 = u & 0xFFFF; 
    u1 = u >> 16; 

    v0 = v & 0xFFFF; 
    v1 = v >> 16; 

    w0 = u0 * v0; 
    t = u1 * v0 + (w0 >> 16); 

    w1 = t & 0xFFFF; 
    w2 = t >> 16; 
    w1 = u0 * v1 + w1; 

    return u1 * v1 + w2 + (w1 >> 16); 
} 

int main() 
{ 
    int u,v; 
    cin >> u >> v; 
    cout << mulths(u, v) << endl; 
    return 0; 
} 

это возвращает продукт двух чисел да или он возвращает самый значительный бит? beacuse, когда я вхожу в 5 и 7, и он возвращается 0вопрос о Multiply высокий подписан

ответ

1

«Multiply high» возвращает высокое слово результата. Например. если ints 32 бита, то при умножении двух 32-битных ints вы получите результат 64 бит. Таким образом, вы можете думать об этом как 32-битное (подписанное) высокое слово и 32-битное (беззнаковое) слово. Например. 0x x 0x456789AB = 0x004EF78252247ACD. Высокое слово (подписанное) = 0x004EF782, низкое слово (без знака) = 0x52247ACD.

Для вашего теста значения 5 и 9 слишком малы, поэтому высокое слово будет равно нулю. Попробуйте более крупные значения, например, приведенные выше, чтобы узнать, получаете ли вы правильный результат, например.

$ g++ -m32 -Wall mulths.cpp -o mulths 
$ ./mulths 
1000 
1000 
0 
$ ./mulths 
100000 
100000 
2 
$ ./mulths 
19088743 # 0x
1164413355 # 0x456789AB 
5175170  # 0x004EF782 
$ 
+0

тот же результат –

+0

Обратите внимание, что вам необходимо использовать достаточно большие значения, если у вас есть 32-битный Интс, например, в десятичной форме, 100000 x 100000 даст высокий результат слова из 2. –

Смежные вопросы