位運算總結與應用

一、求下面函數的返回值

int func(x)
{
    int count = 0;
    
    while(x)
    {
        count++;
        x = x&(x-1);
    }

    return count;
}

功能:將x轉化爲2進制,看含有的1的個數。

每執行一次x = x&(x-1),會將x用二進制表示時最右邊的一個1變爲0,因爲x-1將會將該位(x用二進制表示時最右邊的一個1)變爲0。

二、下面函數的作用

bool func(int x)
{
    if( (x&(x-1)) == 0 )
        return true;
    else
        return false;
}

功能:判斷一個數是否2的N次方。

如果一個數是2的n次方,那麼這個數用二進制表示時其最高位爲1,其餘位爲0,減去1和原來的數進行位與運算,得到的結果可以作爲判斷依據。

這裏== 優先級高於 &,所以以上代碼可以優化:

bool func(int x)
{
    return !(x&(x-1));
}

三、求下列函數的調用結果

int func(int x, int y) {
    return ( (x&y) + ((x^y) >> 1) );
}

int main()
{
    cout << func(729, 271);
}

功能:計算兩個數的平均值。

按位與是相同位和的一半,按位或是不同位的和,右移相當於除以2,所以該函數相當於求兩個數之和的一半。

所以,輸出500;

所以要通過位運算來實現兩個數之和,可以這樣做:

int add(int a, int b)
{
    if (0 == b)
	return a;

    int sum, carry; //和和進位
    sum = a^b; //兩個數的沒有進位的和
    carry = (a&b) << 1;

    return add(sum, carry); //遞歸調用
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章