32位CPU中,实现32位无符号乘法,返回64位无符号数据。原理解析。
static inline u64 mul64_32x32(u32 u, u32 v)
{
uint32_t u0, v0; //低16bit部分。
uint32_t u1, v1; //高16bit部分。
uint32_t w0, w1, w2, t;//存储计算中间结果。
uint32_t x, y;//计算结果高32bit,低32bit。
u0 = u & 0xFFFF;//取u的低16bit。
u1 = u >> 16;//取u的高16bit。
v0 = v & 0xFFFF;//取v的低16bit
v1 = v >> 16;//取v的高16bit.
w0 = u0 * v0;//u和v低16bit进行相乘。
t = u1 * v0 + (w0 >> 16);//u低16bit与v高16bit相乘的结果,加上w0的进位(进位到bit16~bit31)结果。计算的结果为bit16~bit47。
w1 = t & 0xFFFF;//t的低16bit。也就是bit16~bit31的值。
w2 = t >> 16;//t的高16bbit,t的进位(进位到bit32~bit47)。
w1 = u0 * v1 + w1;//更新为低 16 bit与高 16 bit相乘的结果加上之前的 w1。(计算结果为bit16~bit48的结果)。
//x is high 32 bits, y is low 32 bits
x = u1 * v1 + w2 + (w1 >> 16);//计算结果的高32bit。(u1*v1