Description

Solution
第一眼觉得有点离谱,啥都不让用;突然想到一种只用加减和移位运算符来模拟乘法的方法,核心思想类似快速乘(龟速乘),将乘数进行二进制差分,对被除数进行移位后再相加。
Code
class Solution {
public:
typedef long long ll;
ll mul(ll a,ll b) {
ll res = 0, cnt = 0;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
res += ((a << cnt) & ((b&1)<<32) - (b&1)), cnt++, b>>=1;
return res;
}
int sumNums(int n) {
int res = mul(n+1,(n>>1)) + mul((n&1),((n+1)>>1));
return res;
}
};

这篇博客介绍了如何仅使用加减和移位运算符来实现整数乘法,通过二进制差分和位操作的方式,避免了传统乘法运算符的使用。代码示例展示了对两个整数进行16次位移和加法操作来完成乘法的过程,并且在最后给出了一个求和函数的实现,该函数应用了这个位操作乘法算法。
4149

被折叠的 条评论
为什么被折叠?



