《程式設計之美 》2.1 位運算實現—交換兩個整數、求和、整數的二進位制表達中1的個數
阿新 • • 發佈:2019-01-22
序
能否利用位運算高效的實現部分演算法是面試中的常見考題,現在講該部分總結如下。一、不用額外變數交換兩個整數的值
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中不同位的個數