前提
- 不知道有什么巧妙解法,这里说一个通解,那就是用位运算实现加减乘除。
为什么要用位运算实现加减乘除?
- 了解计算机通过半导体实现加减乘除的逻辑
- 不装了,其实根本就是面试可能会问
- 加法这里可能会啰嗦一些,后面基于加法就没有这么痛苦了
加法
- 加法,其实是由两种状态组成的:
- 第一是各个数位都没有进位,这种最简单,就是将对应位置的数值直接相加即可
- 第二是则是数位中有进位,这种也不难,首先是将对应位置数值加起来之后,要模上进制数,然后考虑进位数怎么计算,回忆下加法的过程,进位数其实就是当前数字除以进制数的下整数,然后再将其加到前面一个数位中,迭代执行,直到没有进位。
- 这就引发了一个问题,既然进位数需要通过除法得到,但是除法又不允许使用,这是否陷入了困境?
- 幸运的是,二进制数的进位其实更简单,因为进位数非0即1,因此,我们只需要知道如何得到正确的进位数即可。
- 我们发现,二进制中,如果有相加数的对应位不都是1,那么就没有进位,此时进位是0,如果有进位,那么对应位置往前进1位,用二进制实现该逻辑就是
(a&b)<<1
- 进位问题解决了,那么其他部分呢,其他部分就如刚刚所说,数位数字模上进制数即可,对于二进制的模2加法,就是异或,也就是
a^b
int add(int a,int b) {
int carry,add;
do{
add = a^b;
carry = (a&b)<<1;
a = add;
b=carry;