位運算可以實現哪些功能

bigface1234fdfg發表於2015-02-03

位運算可以實現哪些功能

    

     許多時候,我們為了減少演算法的時間複雜度,都是推薦使用位運算,今天我們整理一下位運算可以實現哪些功能。


1. 乘除2


    左移1位乘以2,左移n位乘以2^n;

    右移1位除以2,右移n位除以2^n;


    舉個例子:

#include<iostream>
using namespace std; 

int main()
{
	int a = 16; 
	int b = 25; 

	//乘除2
	cout<<(b<<1)<<' '<<(a>>1)<<endl; 

	return 0; 
}


2. 判斷奇偶數


    用到位運算中的按位與,和1按位與。

    如下:


#include<iostream>
using namespace std; 

int main()
{
	int a = 16; 
	int b = 25; 

	// 判斷奇偶數
	if(a & 1)
		cout<<"Odd"<<endl; 
	else
		cout<<"Even"<<endl; 

	return 0; 
}


3. 取餘運算


    還是使用按位與運算子,只不過不再是和1按位與了。

#include<iostream>
using namespace std; 

int main()
{
	int a = 16; 
	int b = 25; 

	// 取餘
	cout<<(a & 3)<<endl;  // 除以4的餘數
	cout<<(a & 7)<<endl;  // 除以8的餘數
	cout<<(a & 8)<<endl;  // 無效,只能運算2的次冪的餘數

	return 0; 
}

分析:注意這個方法只能計算2的次冪的餘數,而且參加按位與的只能是2^n-1,因為這些數的二進位制形式全是1.


4. 求相反數

    使用按位取反運算子。

	//求相反數
	cout<<(~a+1)<<endl; 


5. 求絕對值

  使用異或運算子(^)

#include<iostream>
using namespace std; 

int main()
{
	int a = -36; 
	int b = 25; 

	// 絕對值
	int tmp = a>>31;  // /a大於等於0時tmp為0,a小於0時tmp為-1  
	int A = (a^tmp)-tmp; 
	cout<<A<<endl; 

	return 0; 
}


    這些基本的數學運算都是可以通過為運算子來實現,時間複雜度都比較低,以後常用。




相關文章