位運算符包括:| 按位或 OR,& 按位與 AND,^ 按位異或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇體驗位運算符在C#中的應用。主要包括:app
○ 進制轉換
※ 十進制轉換成二進制
※ 二進制轉換成十進制
○ | 按位或操做符
○ & 按位與操做符
○ ^ 按位異或操做符
※ 使用^按位異或交換2個數
※ 使用^按位異或進行加密運算
○ ~ 取反操做符
○ x << n 左移運算符
○ x >> n 右移運算符加密
進制轉換spa
由於位運算是在二進制基礎上進行的,因此進制轉換是位運算的前提。code
□ 十進制轉換成二進制htm
好比,把10進制的數783轉換成二進制,通過下面10個步驟。blog
把餘數從下到上拼接起來,就是783的二進制,即1100001111。字符串
在C#中,若是是Int16類型,意味着有16位整型數。對於783來講,若是表示成Int16類型,不足16位的話,要在前面補0,即要在1100001111補6個0,完整的表示是:0000001100001111。一樣的道理,若是是Int32類型,意味着有32位整型數。rpc
如何把-783轉換成Int16類型的二進制呢?get
→咱們知道正數783表示成Int16類型的二進制是:0000001100001111
→在每一個位置上倒轉,即若是是1就變成0,反之亦然,倒轉後變成:1111110011110000
→再加上1,變成:1111110011110001string
□二進制轉換成十進制
好比,把Int16類型的二進制數0000000100010110轉換成十進制,通過下面的16個步驟。
從右向左,依次乘以2的n次方。
把全部的結果加起來:
0 + 2 + 4 + 0 + 16 + 0 + 0 + 0 + 256 + 0 = 2 + 4 + 16 + 256 = 278
因此,0000000100010110的十進制數是278。
如何把一個Int16類型的負二進制數轉換成十進制呢?
好比有這樣的一個二進制數:1111111111010011(Int16類型,第一位是數字1表示負數,第一位是數字0表示正數)
→每一個位置上反轉變成:0000000000101100
→進過計算,獲得的十進制數是:44
→再加1,獲得:45
→再變成負數,獲得:-45
| 按位或操做符
假設,十進制數38和53進行按位或計算。
→通過計算,十進制數38的二進制表達是00100110,十進制數538的二進制表達是00110101。
→對| 按位或操做符來講,只要對應的二個二進位有一個爲1時,結果就爲1。
→把獲得的00110111轉換成十進制就是:55
若是用C#表示就是:
byte result = 38 | 53;
& 按位與操做符
假設,十進制數76和231進行按位與計算。
→通過計算,十進制數76的二進制表達是01001100,十進制數231的二進制表達是11100111。
→對& 按位與操做符來講,只要對應的二個二進位有一個爲0時,結果就爲0。
→把獲得的 01000100轉換成十進制就是:68
若是用C#表示就是:
byte result = 76 & 231;
^ 按位異或操做符
假設,十進制數138和43進行按位與計算。
→通過計算,十進制數138的二進制表達是10001010,十進制數43的二進制表達是00101011。
→對^ 按位異或操做符來講,當兩對應的二進位相異時,結果爲1。
→把獲得的10100001轉換成十進制就是:161
若是用C#表示就是:
byte result = 138 ^ 43 ;
□ 例子1:使用^ 按位異或交換2個數
int x = 4;
int y = 6;
x ^= y;y ^= x;x ^= y;Console.WriteLine(x); //6
Console.WriteLine(y); //4
以上過程是這樣的:
(1)x ^= y,至關於x = x ^ y
x的二進制是:00100
y的二進制是:00110
x和y進行異或,結果是:00010
x轉換成十進制後,x爲:2
(2)y ^= x,至關於y = y ^ x
y的二進制是:00110
x的二進制是:00010
y和x進行異或,結果是:00100
y轉換成十進制後,y爲:4
(3)x ^= y,至關於x = x ^ y
x的二進制是:00010
y的二進制是:00100
x和y進行異或,結果是:00110
x轉換成十進制後,x爲:6
□ 例子2:使用^按位異或進行加密運算
string msg = "這是我要加密的string字符串";string k = "mypassword";for(int i = 0; i < msg.Length; i++){sb.Append((char)(msg[i] ^ k[i % k.Length]));
}Console.WriteLine(sb.ToString());
~ 取反操做符
假設,十進制數52進行取反計算。
→通過計算,十進制數52的二進制表達是00110100
→對~ 取反操做符來講,對應的二進位數按位求反,0變成1,1變成0
→把獲得的11001011轉換成十進制就是:203
若是用C#表示就是:
byte result = ~52;
x << n 左移運算符
每位向左移動n位,右邊空缺的位置補0。
假設,十進制數154進行左移。
若是用C#表示就是:
byte b1 = 154;
byte b2 = (byte)b1 << 1;Console.Writeline(b2);//結果是52,二進制是00110100
x >> n 右移運算符
每位向右移動n位,左邊空缺的位置補0。
假設,十進制數155進行右移。
若是用C#表示就是:
byte b1 = 155;
byte b2 = (byte)(b1 >> 1);Console.WriteLine(b2); // 結果: 77
總結:
| 按位或操做符來講,只要對應的二個二進位有一個爲1時,結果就爲1
& 按位與操做符來講,只要對應的二個二進位有一個爲0時,結果就爲0
^ 按位異或操做符來講,當兩對應的二進位相異時,結果爲1
~ 取反操做符來講,對應的二進位數按位求反,0變成1,1變成0
x << n 左移運算符,每位向左移動n位,右邊空缺的位置補0
x >> n 右移運算符,每位向右移動n位,左邊空缺的位置補0
參考資料:
Swapping of variables without Third Variable using XOR Logic
Understand how bitwise operators work
http://baike.baidu.com/view/9895739.htm?fr=aladdin