`

笔试中常见的位运算案例分析

阅读更多

 参考博文  : http://blog.csdn.net/morewindows/article/details/7354571

 

 输入一个数字,然后计算出它二进制中'1'的个数。此方法相对于使用自带的String库,把空间节约到了O(1)。

 

static int bitCount(int n) {
     int count = 0;
	  while (n != 0) {
		count += (n & 1);
		n >>= 1;
	   }
	return count;
	}

 获取x中0到16位的低位值

x = x & 0xffff;

 获取16~32位的值

x = (x >> 16 ) & 0xffff;

 求相反数 // 取反+1

i = (i ^ -1) + 1;

     

求绝对值

   证明 :

   先移位来取符号位,int i = a >> 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1。

//by MoreWindows( http://blog.csdn.net/MoreWindows )  
int my_abs(int a)  
{  
    int i = a >> 31;  
    return i == 0 ? a : (~a + 1);  
}  

  或者 因为 x >>31 只可能我0或-1 可能你会觉得-1右移31不会是1吗,怎么变成了-1了,因为负数右移的时候,左边填充的不是0而是1!!

   1. 与0相异或,不变 如果x是正数的话,不变

   2. 与-1(oxffff) 相异或,相当于取反,以为为1的地方变成了0,为0的地方变成了1 ,然后+1

i = (x ^ (x >> 31)) - (x >> 31);

 

 交换

void swap(int a,int b){
    a = a^b;
    b = a^b;
    a = a^b;
}

  证明:

     第一步  a^=b 即a=(a^b);

     第二步  b^=a 即b=b^(a^b),由于^运算满足交换律,b^(a^b)=b^b^a。由于一个数和自己异或的结果为0并且任何数与0异或都会不变的,所以此时b被赋上了a的值。

     第三步 a^=b 就是a=a^b,由于前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a会被赋上b的值。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics