位运算实现四则运算

来源:互联网 发布:微软人工智能解决方案 编辑:程序博客网 时间:2024/06/04 23:10
          今天我们来说一下怎么使用位运算来实现整数的四则运算!
        四则运算归根结底是加法运算。其他运算都是建立在加法的基础之上,所以我们先来说一说怎么
实现加法。

一、加法:

              (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); //取反与求补差1return 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;}



五、运行截图:

          

原创粉丝点击