剑指Offer解题报告(Java版)——不用加减乘除做加法 47

   

引言

   

一般这种不能用四则运算的题都只有用位运算来做,目的是加强大家对计算机计算的理解,真是有点扯淡呢

   

解决问题

   

首先我们得思考计算机是怎样做加法的呢,比如34,如果转换成二进制是00110100,加起来是7,也就是0111,相当于是两个二进制的异或运算

   

但是我们再举一个例子就是44,会发现,两个二进制是01000100,异或运算的话结果为0000,但是我们想要的是1000,这是因为异或运算没有考虑到进位的问题,看来我们还要用一个运算去考虑进位的问题,还记得进位是怎样算的吗,如果两个树相同位上都是1,那么就是要进位,这实际上就是与操作

   

而最后我们需要把进位和没考虑进位的sum加起来,这里又不能用到sum,摔,此时我们又要用到之前讲的与和异或操作,这里我们取巧,就把sum赋值给n1,把carry赋值给n2,去算,停止的条件是n2==0,也就是没有进位了

   

static int add(int n1,int n2){

int sum=0;

int carry=0;

do {

sum=n1^n2;

carry=(n1&n2)<<1;

n1=sum;

n2=carry;

} while (n2!=0);

return sum;

posted @ 2015-05-03 19:50  keedor  阅读(247)  评论(0编辑  收藏  举报