zoukankan      html  css  js  c++  java
  • 剑指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;

  • 相关阅读:
    POSIX 互斥锁: pthread_mutex_t
    cocos2dx 常见的32种切换场景的动画
    在Xcode中制作.a文件
    Xcode设置项之Architectures和Valid Architectures
    C/C++位操作运算符
    ValueVector和ValueMap
    iOS工程结构理解
    CocoaPods的安装
    Win7平台下配置Sublime Text2 的C++编译环境
    Objective-C中Block的常见用法
  • 原文地址:https://www.cnblogs.com/keedor/p/4474551.html
Copyright © 2011-2022 走看看