2010-07-13 181 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; 
} 

是否返回两个数字的乘积是或它返回最重要的位? 因为我输入5和7并返回0关于乘以高位有符号的问题

回答

1

“乘以高位”返回结果的高位字。例如。如果整数是32位,那么当你乘以两个32位整数时,你会得到一个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

结果相同 – 2010-07-13 07:25:36

+0

请注意,如果您有32位整数,例如,您需要使用相当大的值。在十进制中,100000 x 100000会给出2的高字结果。 – 2010-07-13 07:35:34