位运算实现四则运算
2017-11-11 22:10
183 查看
今天我们来说一下怎么使用位运算来实现整数的四则运算!
四则运算归根结底是加法运算。其他运算都是建立在加法的基础之上,所以我们先来说一说怎么
实现加法。
一、加法:
(1) 我们通过手算,可以发现:不需要进位的二进制加法运算可以通过异或运算来实现。
举个栗子: 5 + 2 = 7
然而,并不是所有的运算都不需要进位,如果有进位我们则需要加上进位。才能得到正确的
结果
(2) 怎么获取进位值呢?
进位值可以通过两个数相与,如果相与之后的值为零,说明没有进位。加法运算结束,
结果即为(1)中的异或值。
如果相与之后的值不为0,则说明有进位,将其左移一位即可得到其进位值。
举个栗子:
(3)将异或值与进位制相加,转(1)。
二、减法(在代码中介绍)
三、除法(在代码中介绍)
四、乘法(在代码中介绍)
好,算法整明白了。开始撸代码:
五、运行截图:
四则运算归根结底是加法运算。其他运算都是建立在加法的基础之上,所以我们先来说一说怎么
实现加法。
一、加法:
(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; }
五、运行截图:
相关文章推荐
- 只用位运算来实现整数的加减乘除四则运算
- 位运算实现加减乘除四则运算
- 实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+
- 在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。
- 位运算实现四则运算
- 位运算实现四则运算
- 不使用四则运算实现加法运算
- 通过位运算来实现基本四则运算
- 位运算实现交换以及四则运算
- 位运算实现四则运算
- 大数运算实现加减乘除四则运算
- 第八周实验报告任务4 实现分数类中的运算符重载,分数类中的对象可以和整数型进行四则运算,且运算符合交换律。
- 第八周上机任务四--实现分数类中的运算符重载,分数类中的对象可以和整型数进行四则运算,且运算符合交换律
- 实现二叉排序树的基本运算算法
- 只使用++运算实现加法,减法,乘法,除法PHP实现
- 矩阵的基本运算 ------ C 实现
- 【PHP内核】语法:不同类型之间数值运算的实现
- 四则运算实现
- 顺序队中实现队列的基本运算
- 递归大总结之位运算实现加法