回忆普通二进制乘法的执行过程:
1110 // 14
* 1011 // 11
-----------
1110 // (1110 << 0)
11100 // (1110 << 1)
000000
+ 1110000 // (1110 << 3)
-----------
10011010 // 154
无进位乘法就是将最后的求和变成了求异或:
1110 // 14
* 1011 // 11
-----------
1110 // (1110 << 0)
11100 // (1110 << 1)
000000
^ 1110000 // (1110 << 3)
-----------
1100010 // 98
无进位乘法的伪代码:
unsigned int carry_less_multi(unsigned short a, unsigned short b)
{
unsigned int ret = 0;
int i = 0;
while (b) {
if (b & 1)
ret ^= (a << i);
b >>= 1;
++i;
}
return ret;
}