C#位運算符的基本用法介紹
位運算符包括:| 按位或 OR,& 按位與 AND,^ 按位異或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇體驗位運算符在C#中的應(yīng)用。
進制轉(zhuǎn)換
因為位運算是在二進制基礎(chǔ)上進行的,所以進制轉(zhuǎn)換是位運算的前提。
十進制轉(zhuǎn)換成二進制
比如,把10進制的數(shù)783轉(zhuǎn)換成二進制,經(jīng)過下面10個步驟。
把余數(shù)從下到上拼接起來,就是783的二進制,即1100001111。
在C#中,如果是Int16類型,意味著有16位整型數(shù)。對于783來說,如果表示成Int16類型,不足16位的話,要在前面補0,即要在1100001111補6個0,完整的表示是:0000001100001111。同樣的道理,如果是Int32類型,意味著有32位整型數(shù)。
如何把-783轉(zhuǎn)換成Int16類型的二進制呢?
→我們知道正數(shù)783表示成Int16類型的二進制是:0000001100001111
→在每個位置上倒轉(zhuǎn),即如果是1就變成0,反之亦然,倒轉(zhuǎn)后變成:1111110011110000
→再加上1,變成:1111110011110001
二進制轉(zhuǎn)換成十進制
比如,把Int16類型的二進制數(shù)0000000100010110轉(zhuǎn)換成十進制,經(jīng)過下面的16個步驟。
從右向左,依次乘以2的n次方。
把所有的結(jié)果加起來:
0 + 2 + 4 + 0 + 16 + 0 + 0 + 0 + 256 + 0 = 2 + 4 + 16 + 256 = 278
所以,0000000100010110的十進制數(shù)是278。
如何把一個Int16類型的負二進制數(shù)轉(zhuǎn)換成十進制呢?
比如有這樣的一個二進制數(shù):1111111111010011(Int16類型,第一位是數(shù)字1表示負數(shù),第一位是數(shù)字0表示正數(shù))
→每個位置上反轉(zhuǎn)變成:0000000000101100
→進過計算,得到的十進制數(shù)是:44
→再加1,得到:45
→再變成負數(shù),得到:-45
| 按位或操作符
假設(shè),十進制數(shù)38和53進行按位或計算。
→經(jīng)過計算,十進制數(shù)38的二進制表達是00100110,十進制數(shù)538的二進制表達是00110101。
→對| 按位或操作符來說,只要對應(yīng)的二個二進位有一個為1時,結(jié)果就為1。
→把得到的00110111轉(zhuǎn)換成十進制就是:55
如果用C#表示就是:
byte result = 38 | 53;
& 按位與操作符
假設(shè),十進制數(shù)76和231進行按位與計算。
→經(jīng)過計算,十進制數(shù)76的二進制表達是01001100,十進制數(shù)231的二進制表達是11100111。
→對& 按位與操作符來說,只要對應(yīng)的二個二進位有一個為0時,結(jié)果就為0。
→把得到的 01000100轉(zhuǎn)換成十進制就是:68
如果用C#表示就是:
byte result = 76 & 231;
^ 按位異或操作符
假設(shè),十進制數(shù)138和43進行按位與計算。
→經(jīng)過計算,十進制數(shù)138的二進制表達是10001010,十進制數(shù)43的二進制表達是00101011。
→對^ 按位異或操作符來說,當兩對應(yīng)的二進位相異時,結(jié)果為1。
→把得到的10100001轉(zhuǎn)換成十進制就是:161
如果用C#表示就是:
byte result = 138 ^ 43 ;
例子1:使用^ 按位異或交換2個數(shù)
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進行異或,結(jié)果是:00010
x轉(zhuǎn)換成十進制后,x為:2
(2)y ^= x,相當于y = y ^ x
y的二進制是:00110
x的二進制是:00010
y和x進行異或,結(jié)果是:00100
y轉(zhuǎn)換成十進制后,y為:4
(3)x ^= y,相當于x = x ^ y
x的二進制是:00010
y的二進制是:00100
x和y進行異或,結(jié)果是:00110
x轉(zhuǎn)換成十進制后,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());
~ 取反操作符
假設(shè),十進制數(shù)52進行取反計算。
→經(jīng)過計算,十進制數(shù)52的二進制表達是00110100
→對~ 取反操作符來說,對應(yīng)的二進位數(shù)按位求反,0變成1,1變成0
→把得到的11001011轉(zhuǎn)換成十進制就是:203
如果用C#表示就是:
byte result = ~52;
x << n 左移運算符
每位向左移動n位,右邊空缺的位置補0。
假設(shè),十進制數(shù)154進行左移。
如果用C#表示就是:
byte b1 = 154; byte b2 = (byte)b1 << 1; Console.Writeline(b2);//結(jié)果是52,二進制是00110100
x >> n 右移運算符
每位向右移動n位,左邊空缺的位置補0。
假設(shè),十進制數(shù)155進行右移。
如果用C#表示就是:
byte b1 = 155; byte b2 = (byte)(b1 >> 1); Console.WriteLine(b2); // 結(jié)果: 77
總結(jié):
| 按位或操作符來說,只要對應(yīng)的二個二進位有一個為1時,結(jié)果就為1
& 按位與操作符來說,只要對應(yīng)的二個二進位有一個為0時,結(jié)果就為0
^ 按位異或操作符來說,當兩對應(yīng)的二進位相異時,結(jié)果為1
~ 取反操作符來說,對應(yīng)的二進位數(shù)按位求反,0變成1,1變成0
x << n 左移運算符,每位向左移動n位,右邊空缺的位置補0
x >> n 右移運算符,每位向右移動n位,左邊空缺的位置補0
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C#筆記之EF Code First 數(shù)據(jù)模型 數(shù)據(jù)遷移
EF 中 Code First 的數(shù)據(jù)遷移網(wǎng)上有很多資料,我這份并沒什么特別。Code First 創(chuàng)建視圖網(wǎng)上也有很多資料,但好像很麻煩,而且親測好像是無效的方法(可能是我太笨,沒搞成功),我摸索出了一種簡單有效的方法,這里分享給大家2021-09-09C#線性漸變畫刷LinearGradientBrush用法實例
這篇文章主要介紹了C#線性漸變畫刷LinearGradientBrush用法,實例分析了線性漸變畫刷LinearGradientBrush的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06