看到乘法,我们首先想到的就应该是移位操作。
分析一下:例如 十进制的11*10=110
二进制:1011 *1010 拆分下,为1011*1000 +1011*0010
对于二进制运算,左移1位,等于乘以 0010;左移3位,等于乘以 1000
所以,二者的乘积为:1011<<3 + 1011 <<1 = 1011000 +10110
具体的代码实现,我们可以用bit_map(bit_map:用一个bit位来标记对应的value)
int multiply(int a, int b)
{
bool neg = (b<0);
if(b<0) b =-b;//先转换为正数
int sum = 0;
map<int,int> bit_map;
for(int i=0; i<32;i++)
bit_map.insert(pair<int, int>(1<<i,i));
while(b>0)
{
int last_bit=bit_map[b&~(b-1)];//取最后一个"1"
sum+=a<<last_bit;
b&=b-1;//消除最后一个1,如果这里不懂得话,可以看我的上一篇博文
http://blog.csdn.net/liyan_jennifer/article/details/21555991
}
if(neg) num=-num;
return num;
}
如果不是很懂的话,我简单说说bit_map的值,就豁然开朗了
二进制 | 十进制 |
1 | 1 |
10 | 2 |
100 | 3 |
…… | …… |
100……0 | 32 |