不用+,-,x,/做加法运算
2013-07-23 12:48
211 查看
废话少说,直接上例子。例如要算14+8的和,平常的思维方式,4+8得2进1,1+1得2不进位,结果就是22.思维方式就是自右往左,边加边求和,再进位,再重复以上步骤。
但是,现在限制住了加减乘除,剩下的只有与或非了。于是加可用异或,求进位可用与,重复上述步骤直到结果正确即可。改进一下,我们可分为三步走:
1,整体求和(异或)
2,整体求进位(与)
3,重复以上步骤(循环或递归)
C++代码如下:
int add(int num1,int num2)
{
while(num2)
{
int sum=num1 ^ num2 ;//异或
int carry=(num1 & num2) << 1 ;//与
num1=sum;
num2=carry;
}
return num1;
}更巧妙的思路:
int add(int a,int b){
char* p= (char *)a ;
cout<<*p<<endl;
return (int)&p[b];//p[b]等价于*(p+b)
}思路是:定义一个char型指针指向a代表的地址,假如a=33,则p指向地址33,p[b]等价于p+b号地址的值,假设b为44,则p[b]指向77号地址的值,所以,对它取地址,就可以得出a+b的值。很巧妙。
但是,现在限制住了加减乘除,剩下的只有与或非了。于是加可用异或,求进位可用与,重复上述步骤直到结果正确即可。改进一下,我们可分为三步走:
1,整体求和(异或)
2,整体求进位(与)
3,重复以上步骤(循环或递归)
C++代码如下:
int add(int num1,int num2)
{
while(num2)
{
int sum=num1 ^ num2 ;//异或
int carry=(num1 & num2) << 1 ;//与
num1=sum;
num2=carry;
}
return num1;
}更巧妙的思路:
int add(int a,int b){
char* p= (char *)a ;
cout<<*p<<endl;
return (int)&p[b];//p[b]等价于*(p+b)
}思路是:定义一个char型指针指向a代表的地址,假如a=33,则p指向地址33,p[b]等价于p+b号地址的值,假设b为44,则p[b]指向77号地址的值,所以,对它取地址,就可以得出a+b的值。很巧妙。
相关文章推荐
- 不用+-*/实现加法运算
- 不用加减乘除实现加法运算
- 第一次写,整理一下如何运用指针在不用加号的情况进行加法运算
- 所谓”不用加号的加法运算“
- 不用加减乘除做加法。。。二进制运算
- 剑指offer 不用加减乘除做加法(位运算实现)
- 不用加减乘除实现加法运算
- 加法的实现-不用加减乘除运算
- 不用加号求加法运算
- 不用加减乘除实现加法运算
- 不用四则运算完成加法运算
- 算法学习(6)----不用 + - × ÷ 做加法运算
- 不用加减乘除做加法运算
- 不用 +,-,*,/四则运算实现加法
- 不用加法操作符(+)实现加法运算
- 不用加减乘除实现加法运算
- 不用‘+’实现加法运算
- 不用加减乘除做加法运算
- 1.A+B问题,不用+实现加法运算
- 不用加减乘除实现加法运算