不用加减乘除做加法
来源:互联网 发布:c语言吧 编辑:程序博客网 时间:2024/05/23 01:17
解析:例如计算(5,17)
5的二进制是101,17的二进制是10001。将计算分为三步:
(1) 各位相加但不计进位,得到的结果是10100;
(2) 记下进位,在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;
(3) 把前两步的结果相加,得到的结果是10110,转换乘十进制正好是22
接下来试着把二进制的加法用位运算来替代,
(a) 不考虑进位对每一位相加,0加0、1加1的结果都是0,0加1、1加0的结果是1;这和异或
的结果是一样的,对异或而言,0和0、1和1或异的结果是0,而0和1,、1和0的异或结果是1.
(b) 接着考虑第二位进位,对于0加0、0加1、1加0而言,都不会产生进位,只有1加1时
会向前产生一个进位,此时可以想象成是两个数先做位运算,然后在向左移一位,
只有两个数都是1的时候,位与得到的结果是1,其余都是0.
(c) 把前两个步骤的结果相加.相加的过程依然是重复前两步,直到不能进位为止。
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;void BinaryRecursion(int n){ if (n == 0){ return; }else{ BinaryRecursion(n / 2); n = n % 2; cout << n; }}int Add(int num1,int num2) { int sum,carry; while(num2 != 0) { cout<<"num1:";BinaryRecursion(num1);cout <<endl; cout<<"num2:"; BinaryRecursion(num2);cout <<endl; sum = num1 ^ num2; cout<<"num1 ^ num2" << sum <<":"; BinaryRecursion(sum); cout<<endl; cout<<"num1 & num2"<<":";BinaryRecursion(num1 & num2);cout<<endl; carry = (num1 & num2) << 1; cout<<"carry:" << carry<<":"; BinaryRecursion(carry); cout<<endl; num1 = sum; num2 = carry; } return num1;}int main() { cout<<Add(15,63)<<endl;}
0 0
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- 不用加减乘除做加法
- Linux 常用指令
- MySQL EXPLAIN 语句的 SELECT TYPE有哪些值
- 安卓中制造一个显示使用了多少时间的方法
- hdoj Bomb 3555 (数位DP&记忆化dfs)好题
- IIR数字滤波器实现(mantlab+C语言)
- 不用加减乘除做加法
- python脚本sqlite3模块的应用
- [Nutch]使用LUKE查看Solr的索引文件内容
- python writelines()函数
- 个人对插件和钩子的理解
- (未完成)Dubbo源码分析(七):Dubbo内核实现之基于SPI思想Dubbo内核实现
- Codeforce 149D(区间dp+括号匹配)
- 1001 of dp
- 屏幕自适应