码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-03 20:32:22      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

? ?

引言

? ?

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

? ?

解决问题

? ?

首先我们得思考计算机是怎样做加法的呢,比如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;

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

标签:

原文地址:http://www.cnblogs.com/keedor/p/4474551.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!