位運算的妙用技巧
阿新 • • 發佈:2018-12-19
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;
}