您的位置:首页 > 其它

位运算实现四则运算

2017-11-11 22:10 183 查看
          今天我们来说一下怎么使用位运算来实现整数的四则运算!
        四则运算归根结底是加法运算。其他运算都是建立在加法的基础之上,所以我们先来说一说怎么
实现加法。

一、加法:

              (1) 我们通过手算,可以发现:不需要进位的二进制加法运算可以通过异或运算来实现。
        举个栗子: 5 + 2 = 7

             


               然而,并不是所有的运算都不需要进位,如果有进位我们则需要加上进位。才能得到正确的
        结果
             (2) 怎么获取进位值呢?
                       进位值可以通过两个数相与,如果相与之后的值为零,说明没有进位。加法运算结束,
               结果即为(1)中的异或值。
                       如果相与之后的值不为0,则说明有进位,将其左移一位即可得到其进位值。
                       举个栗子:

                      


              (3)将异或值与进位制相加,转(1)。

二、减法(在代码中介绍)
三、除法(在代码中介绍)
四、乘法(在代码中介绍)

  好,算法整明白了。开始撸代码:

#include <stdio.h>

/*
*功能: 两个数相加
*@num1, @num2 加法的两个操作数
*返回值 : 两个num的相加后的值
*/
int Add(int num1, int num2)
{
int exclusive_val = num1;  //异或值
int carry_val = num2;      //进位值

exclusive_val = num1 ^ num2;           //取第一次异或值(没有进位的异或就是相加)
carry_val = (num1 & num2) << 1;        //取第一次进位值

//进位值为0是循环终止条件
while (carry_val)
{
int temp = exclusive_val;
exclusive_val = exclusive_val ^ carry_val;  //异或值与进位值进行异或
carry_val = (temp & carry_val) << 1;

}
return exclusive_val;
}

/*
*功能: 减法
*算法: A - B = A + B(补码) = A + (B反码 + 1) = A + (~B + 1)
*@num1, @num2; 减法的两个操作数
*返回值: 两个数的相减值
*/
int Sub(int num1, int num2)
{
int temp = Add(~num2, 1); //取反与求补差1
return Add(num1, temp);
}

/*
*功能: 除法
*算法: A 除 B 的意义就是看A里有多少个B,可以通过A - B实现。
*      A一直循环减B,直到结果小于0。循环的次数就是结果。
*@num1, @num2; 除法的两个操作数
*返回值: 两个数的相除值
*/
int div(int num1, int num2)
{
int count = 0;
while (1)
{
if ((num1 = Sub(num1, num2)) < 0)
{
break;
}
count++;
}
return count;
}

/*
*功能: 乘法
*算法: A 乘 B 的意义就是A个B累加,定义一个累加器count = 1;
*     可以通过循环A次累加B相加实现。
*@num1, @num2; 乘法的两个操作数
*返回值: 两个数的相乘值
*/
int mult(int num1, int num2)
{
int count = 0;
int result = 0;
int temp = num2;
while (1)
{
if (num1 == count)
{
break;
}
result = Add(result, temp);
count++;
}
return result;
}
int main(void)
{
int num1, num2;
while (1)
{
printf("请输入两个整数: \n");
scanf("%d%d", &num1, &num2);
printf("%d + %d = %d\n", num1, num2, Add(num1, num2));
printf("%d - %d = %d\n", num1, num2, Sub(num1, num2));
printf("%d * %d = %d\n", num1, num2, mult(num1, num2));
printf("%d / %d = %d\n", num1, num2, div(num1, num2));
}
return 0;
}


五、运行截图:



          
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: