加法
十进制的加法运算
例子:5 + 17 = 22
- 只做各位相加不进位,结果为 12(个位数 5 和 7 相加不进位是 2,十位数 0 和 1 相加结果为1);
- 做进位,5 + 7 中有进位,进位的值是 10;
- 把前面两个结果加起来, 12 + 10 的结果是 22,刚好 5 + 12 = 22;
二进制的加法运算
例子: 5 + 17 = 22(5 的二进制是 101,17 的二进制是 10001)
- 各位相加不进位,结果是 10100;
- 记下进位,只在最后一位相加时产生一个进位,结果是二进制的 10;
- 把前两步的结果相加,结果是 10110,换算成十进制是 22;
位运算代替加法运算
- 不考虑进位,对每一位相加。0 加 0 与 1 加 1 的结果都是 0, 0 和 1 与 1 和 0 的结果都是 1,这和异或的结果是一样的;
- 进位,对 0 加 0、 0 加 1、 1 加0 而言,都不会产生进位i,只有 1 加 1时,会向前产生一个进位,把两个数做与运算,然后再向左移动一位;
- 把两边步骤的结果相加,就相当于输入前两部的结果来递归调用自己;
代码
int AddWithoutArithmetic(int num1, int num2)
{
if(num2 == 0)
return num1;
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
return AddWithoutArithmetic(sum, carry);
}
减法
- 减法相当于加法加上减数的相反数;
- 二进制的相反数就是取反加 1;
代码
//减法:这个和加法一样了,首先取减数的补码,然后相加。
int negative(int a)//取补码
{
return add(~a,1);
}
int sub(int a,int b)
{
return add(a,negative(b));
}
乘法
例子:a × b = ab
- 各位上的数如果为 1,则加上 a,如果不为 1,则不加;
- b 右移一位,a 左移一位;
代码
//正数乘法运算
int Pos_Multiply(int a,int b)
{
int ans = 0;
while(b)
{
if(b&1) //b最后一位是否为1
ans = Add(ans, a);
a = (a<<1);
b = (b>>1);
}
return ans;
}
除法
除法就是由乘法的过程逆推,依次减掉(如果x够减的)y(231),y(230),...y8,y4,y2,y1。减掉相应数量的y就在结果加上相应的数量。
代码
//除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
int Pos_div(int x,int y)
{
int ans=0;
for(int i=31;i>=0;i--)
{
// //比较x是否大于y的(1<>i) >=y )
{
ans+=(1<