1. 程式人生 > >位運算的妙用技巧

位運算的妙用技巧

C/C++語言提供的位運算子有:

運算子 含義 功能
& 按位與 兩個二進位制位都為1,則該位的結果值為1;否則為0。
| 按位或 兩個二進位制位中只要有一個為1,該位的結果值為1。
按位異或 兩個二進位制位不同則結果為1(真),相同則結果為0(假)
取反 一個二進位制數按位取反,即將0變1,將1變0。
<< 左移 左移運算子是用來將一個數的各二進位制位全部左移N位,右補0。
>> 右移 表示將a的各二進位制位右移N位,移到右端的低位被捨棄,對無符號數,高位補0。

位運算的結果演示:

位運算 或 “|” or 與 “&”and 非 “~” not 異或 “^” xor
運算元1 01010101 11010101 10101010  10000001
運算元2 00101010 10101010 (無)  01111111
也能算結果 01111111 10000000 01010101  11111110

    根據上述特性,可以產生以下技巧:

  【判斷一個數的奇偶性】

template<class Type>
inline bool Parity(Type value)
{
	/*
	 0010         1111          
	 0001         0001
	*/

	return (value & 1 != 0); 
}


int main()
{
 
	cout <<"是否是奇數"<< Parity<short>(2) << endl;
	cout <<"是否是奇數" << Parity<unsigned short>(2) << endl;
	cout <<"是否是奇數" << Parity<int>(3) << endl;
	cout <<"是否是奇數" << Parity<unsigned int>(3) << endl;
}

【a 異或b, 然後再異或b ,會得到a】

//一般用於加解密
int main()
{
	int  key = 12345;
	 
	cout <<"100^key			"<< (100^key )<< endl;
	cout <<"100^key^key	"<< (100^key^key) << endl; 

	//利用異或結果,可以推出key
	cout << "100^12381			" << (100^12381) << endl;
}