zoukankan      html  css  js  c++  java
  • # LeetCode 371 Sum of Two Integers

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

    Example:

    Given a = 1 and b = 2, return 3.

    哎,这道题我想到了应该使用位运算来实现,但是对计算机底层的原理不了解,所以没想出来,这里做下笔记。

    该题目涉及到两个逻辑运算操作,&^

    看看一个例子,19+7:

    &表示逻辑_与_运算,即

    	 10011
    	&00111
    	=00011
    

    ^表示逻辑_异或_运算,即

    	 10011
    	^00111
    	=10100
    

    19+7:

    	 10011
    	+00111
        =11010
    

    这么看来好像没啥关系啊?

    好了,我们来好好观察一下,对于二进制数的加减法,是不是如果对应位上的值相同,那么它的结果对应的位置就计算为0(这里先不考虑借位关系)?

    如果不考虑借位,那么任意两个二进制数无论加减,它们的结果都应该是它们逻辑_异或_运算的结果吧。

    同样,我们观察一下上面的逻辑_与_,只有对应位置相同,且都是1,它的结果才是1,这个正好就是每一位运算产生的进位值吗?

    也就是说,我们通过这两种运算,将它的和分解开来了,可以认为是将结果信息分开在了两个变量里面。

    而要把这两个结果合并为和值,我们只需要不断的这么计算,知道进位值变为0,不就是我们所要的结果吗?

    	public int getSum(int a, int b) {
    	    int carry = a&b;//得到进借位的结果
    	    int result = a^b;//得到当前的结果值,就叫基础值好了
    	    int tmpc;//临时变量
    	    while(carry!=0){//开始循环,知道进借位的值变为0,说明我们将所有的信息都存入result了
    	        tmpc = carry<<1;//在使用时,要记得,不论是进位,还是借位,都是向高位计算
    	        carry = result & tmpc;//取得新的进借位结果
    	        result = result ^ tmpc;//新的基础值
            }
    	    return result;
    	}
    

    抽时间得看看计算机的基础知识,其实位运算是非常重要的,毕竟,计算机的任何复杂运算都是通过位运算操作0,1来实现的。

  • 相关阅读:
    Python-文件处理
    自动化测试框架(一)
    Turbine Netflix
    java基础笔记-日常问题总结不定期更新
    集合类库上(list,queue)
    日期相关类
    迭代与JDB
    团队组建——日渐消瘦队~
    结对学习感想
    实验一《Java开发环境的熟悉》_实验报告
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/6358550.html
Copyright © 2011-2022 走看看