zoukankan      html  css  js  c++  java
  • 用位运算实现两个整数的加法运算

    

    《剑指OfferP238,《程序猿面试宝典》P40

    分析:没有进位的加法运算能够用异或^来实现

         进位仅仅有1&1存在进位问题,故先做位与&。再往前进一位,即左移一位

         不断循环和递归,直至进位为0,不产生进位,终于实现加法运算

    方法一:递归实现


    int Add(int num1,int num2)
    {
    	if(num2 == 0)
    	{
    		return;
    	}
    	int sum ,carry;
    	sum = num1 ^ num2;
    	carry = (num1 & num2) << 1;
    	return Add(sum,carry);
    }
    

    方法二:循环实现

    int Add(int num1,int num2)
    {
    	int sum ,carry;
    	do
    	{
    		sum = num1 ^ num2;
    		carry = (num1 & num2) << 1;
    
    		num1 = sum;
    		num2 = carry;
    	}
    	while(num2 != 0)
    	return num1;
    }
    

    Tips1:推断一个数是否是2^N,不用循环语句进行推断;


    分析:由2^N二进制写成100000…的形式,故X&(X-1)=0


    结果:。(X&(X-1))为真


     


    发散:1.用以解决求取数字中1的个数的问题


    leetcode-191Number of 1 Bits二进制数字中1的个数


    http://blog.csdn.net/woliuyunyicai/article/details/44179743


    2.求出一个数最合适(大于该数)的2^N


    JavaArrayQueue实现方法:

    if (numElements >= initialCapacity) {
                initialCapacity = numElements;
                initialCapacity |= (initialCapacity >>>  1);
                initialCapacity |= (initialCapacity >>>  2);
                initialCapacity |= (initialCapacity >>>  4);
                initialCapacity |= (initialCapacity >>>  8);
                initialCapacity |= (initialCapacity >>> 16);
                initialCapacity++;
    
                if (initialCapacity < 0)   // 相应(0x7FFFFFF++)的情况
                    initialCapacity >>>= 1;// 则右移一位。分配2^30块内存
            }
    

    Tips 2.x&y+((x^y)>>1) = (x+y)/2


    解析:x&yx,y同样位上的值(01)相加乘以1/2(1&1 = 1,(1+1/2=1);不同位置0


         x^y 同理指在不同位上的值相加的结果,同样位置01^0 = 1;(1+0=1


    Tips 3.不用推断语句找出两个数字ab之间的较大值

    方法一:int max = ((a+b)+ abs(a-b))/2  //利用数学方法
    方法二:int num[2] = {a,b};
            int c = a- b;
    		c = unsigned(c) >> (sizeof(int)*8 -1);
            int max = num[c];
    


    解析:即若a>b,c>0,符号位=0;否则,符号位=1;右移31位获得符号位




  • 相关阅读:
    IOS调试下载的demo出现说项目不能在什么的SDK调试
    IOS手势基本用法
    IOS没有服务器断怎么调试Push代码
    VS Tips (Advance part)
    [转]如何理解C runtime library (C运行时库)
    Use AQTime to find the bottleneck of program module
    [转]Reflection: Discovery and Execution
    如何禁止生成stack对象或heap对象
    VS Tips (Basic part)
    栈对象、堆对象、静态对象的比较
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7010346.html
Copyright © 2011-2022 走看看