1. 程式人生 > >《程式設計之美 》2.1 位運算實現—交換兩個整數、求和、整數的二進位制表達中1的個數

《程式設計之美 》2.1 位運算實現—交換兩個整數、求和、整數的二進位制表達中1的個數

能否利用位運算高效的實現部分演算法是面試中的常見考題,現在講該部分總結如下。

一、不用額外變數交換兩個整數的值

void exchange(int &a , int &b)
{
	if(a == b)
	{
		return;
	}//if
	
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
}

二、不用加法實現求和

int add(int a , int b)
{
	int sum = a;
	
	/*直到進位的結果為0*/
	while(b != 0)
	{
		sum = a ^ b; /*不考慮進位的和*/
		b = (a & b) << 1; /*只考慮進位的產生值*/
		a = sum;
	}//while
	return sum;
}

三、整數的二進位制表達中1的個數

/*方法一:給定一個32位整數n,每次進行無符號右移1位,檢查最右邊的bit是否為1*/
int Count1(int n)
{
	int ret = 0;
	while(n != 0)
	{
		res += n & 1;
		n >>= 1;
	}//while
	return ret;
}

/*方法二:迴圈次數只與1的個數有關*/
int Count2(int n)
{
	int ret = 0;
	while(n != 0)
	{
		++ret;
		n &= (n-1); //抹掉最右邊的1
	}//while
	return ret;
}

相關問題:

給定兩個正整數(二進位制形式表示)A和B,問把A變為B需要改變多少位(bit)?也就是說整數A和B的二進位制表示中有多少位是不同的?

答:

C = A & B;  //求A與B中有多少位相同

D = A | B;  //包括A和B中為1的位

E = C ^ D;  //即為A與B中不同位的個數