又来一题咯:求两个整数的之和,要求在函数体内不得使用+、-、

呵呵!此题看到后开始感觉很无语,其实大家看到后我感觉都是会有一个想法:那就是,此题不要用四则运算,那么就是位运算,对!这是大家的思维不错,但是具体怎么做呢?呵呵~~~O(∩_∩)O~

首先,我们必须要转化为二进制分析是吧,这个是必须的哦!例如:(5 + 17)D == ( 101 +10001)B结果应该是10110吧!那么我们分析:对于二进制的加法而言,1 + 1 = 0, 1 + 0 = 1, 0 + 0 =0,那么这个与位运算里面的“异或”是一样的是吧!呵呵,那么 if 我们先不考虑进位的话( 也就是有点像汇编里面的ADDAX,,BX;有没有进位我先不考虑,在ADC中再说吧,呵呵~) 那么、我们的第一个数值就出来咯就是:tempNum1 = num1 ^ num2;那么进位怎么办呀?我们再看,if我们还是用二进制加法的话,那么0 +0 的进位是0,1 + 0 的进位是0,只有1 + 1的进位是有效的是吧!再联系一下位运算的&运算,只有1&1 = 1(也就是相当于是有效的运算,O(∩_∩)O~),所以我们可以先 num1& num2 ,但是你要注意那么我们的carry(也就是进位怎么加上去呢),我们知道进位是进到高一位的,那么不就是"<<" 的左移运算么?!同时我们也知道,if num1和num2 相互 &之后是0,那么就是不存在进位了,那么就是相当于运算完成,所以综上所述,我们可以用递归的思想来做此题,所以思路就很清晰了不是么~?!呵呵,参考代码如下:

int calculate( int num1, intnum2)//! 当然初始化进入的时候是两个intbianl

{//! 后面递归进入的其实就是位运算的carry了(进位情况 )

if(0 == num2)

{

return num1;

}

int sumTemp = num1 ^num2;//! 先做不进位的处理

int carry = ( num1& num2)<< 1; //! 进位处理

return calculate(sumTemp,carry);

}

呵呵,好玩好玩,其实大家也可以用汇编处理的,但是小弟能力不够,就不写了啊O(∩_∩)O~

人生没有彩排,每天都是现场直播。

又来一题咯:求两个整数的之和,要求在函数体内不得使用+、-、

相关文章:

你感兴趣的文章:

标签云: