午夜精品久久久久久久99热-午夜精品久久久久-午夜精品成人毛片-午夜黄网站-国产日韩精品欧美一区视频-国产日韩精品欧美一区色

左移運算符優先級(C語言學習筆記10按位運算和移位運算)

左移運算符優先級(C語言學習筆記10按位運算和移位運算)

寸婭芳 2025-04-17 科技 96 次瀏覽 0個評論
按位運算和移位運算

按位運算(Bitwise),包括與(&)、或(|)、非(~)、異或(^)共4種運算。 移位(shift)運算,包括左移(<<)、右移(>>)、無符號右移(>>>)共3種。

整數的位運算操作簡單,但細節不少,使用時需要留心檢查,以便確認結果是否正確。

細節1:位運算適用于整數類類型和字符類型

包括 sbyte(System.SByte)、byte(System.Byte)、short(System.Int16)、ushort(System.UInt16)、 int(System.Int32)、 uint(System.UInt32)、 long(System.Int64)、 ulong(System.UInt64)、 nint(System.IntPtr)、 nuint(System.UIntPtr)、 char(System.Char)。

細節2: 這些操作針對 int、 uint、 long、 ulong 類型定義

也就是說,這些操作本質上是在32位或64位整數上進行的,其結果也是這些類型。 (包括nint和nuint,nint和nuint由平臺定義,要么是32位,要么是64位的整數)。 如果兩個操作數都是其他整數類型(sbyte、byte、short、ushort 或 char), 它們的值將轉換為 int 類型,結果類型也是 int 類型。 如果操作數是不同的整數類型,它們的值將轉換為最接近的包含整數類型。

示例代碼說明

為了方便展示,下面代碼引入了一個自定義方法 string BitStr(整數類類型),用來顯示整數的二進制形式,例如:

BitStr((byte)2) 返回 "0b_0000_0010"

BitStr(16) 返回 "0b_0000_0000_0000_0000_0000_0000_0001_0000"

BitStr(-1) 返回 "0b_1111_1111_1111_1111_1111_1111_1111_1111"

當然,也可以直接使用 Convert.ToString(value, 2) 來得到二進制字符串,只是格式略有不同。

在C# 交互窗口(C# Interactive) 環境中,很容易輸入和運行一些代碼片段,用來進行一些功能驗證。 具體操作方式是,在vs2022中,選擇菜單: 視圖(View)--- 其它窗口(Other Windows)--- C# 交互窗口(C# Interactive)。

~ 邏輯非(NOT)運算,一元操作,只有一個運算數

按位非(求反)運算,在每一位上,1變為0,0變為1。

C#語言學習筆記10 —— 按位運算和移位運算

& 邏輯與(AND)運算

按位與運算,在兩個操作數每一對應位上,都是1才為1,否則為0。

C#語言學習筆記10 —— 按位運算和移位運算

| 邏輯或(OR)運算

按位與運算,在兩個操作數每一對應位上,只要有1則為1,全部0才為0。

C#語言學習筆記10 —— 按位運算和移位運算

^ 邏輯異或(XOR)運算

按位與運算,在兩個操作數每一對應位上,相同則為0,不同則為1。

C#語言學習筆記10 —— 按位運算和移位運算

左移位運算符 <<

所有數位向左移動,高位丟棄,低位補0。

移位運算符的移位計數說明:因為按位運算的操作是針對32位或64位整數定義的,所以能夠移動的位數是有范圍的, 對于 x << count 來說,

如果 x 的類型為 int 或 uint,則移位計數由右側操作數的低階五位定義。 即 count = count & 0b_1_1111,也等于 count = count % 32, 實際移動位數在0和31之間。

如果 x 的類型為 long 或 ulong,則移位計數由右側操作數的低階六位定義。 即 count = count & 0b_11_1111,也等于 count = count % 64, 實際移動位數在0和63之間。

C#語言學習筆記10 —— 按位運算和移位運算

右移位運算符 >>

右移位運算和左移位運算一樣,移位計數有相同的限制。

右移位運算分為兩種,一種是算術右移位運算,一種是邏輯右移位運算, 它們的區別在于移位的是有符號數類型,還是無符號數類型,它們最高位的處理不一樣。

算術右移位運算

對于有符號數類型,執行算術右移位。 移位時,最低位舍棄,最高位補符號位。 也就是說,原來最高位是0的,右移時繼續補0。 原來最高位是1的,右移時繼續補1。

最高位為0時是正數,最高位為1時是負數。 所以在右移位過程中,符號保持不變。

C#語言學習筆記10 —— 按位運算和移位運算

邏輯右移位運算

對于無符號數類型,進行邏輯右移位。 移位時,最低位舍棄,最高位補0。

C#語言學習筆記10 —— 按位運算和移位運算

無符號右移運算符 >>>

為了方便,C# 11 開始引入無符號右移,不區分有符號數和無符號數, 移位時,最低位舍棄,最高位補0。

C#語言學習筆記10 —— 按位運算和移位運算

細節3:復合運算(比如 >>= )操作數的類型保持不變

例如,對于 a >>= 3,a 的類型保持不變。顯然,這是必須的。覺得可以這樣理解, 在運算過程中,遵循的規則和上面所說的一樣,但系統根據需要,對結果進行處理, 把結果轉化為a的類型(比如舍棄了不需要的高位字節)。

C#語言學習筆記10 —— 按位運算和移位運算

細節4:按位運算和一些其它類似操作的區別

第一,&(邏輯 AND)、|(邏輯 OR)和 ^(邏輯異或)同樣用于bool類型,它們有類似的邏輯,但是細節上有很多不同,應視為不同的類別。

bool 類型的邏輯運算,操作數包括 true、false、null 這3個不同的值,運算結果也是 true、false、null 這3個值之一。

第二,條件邏輯運算符,&&(條件邏輯與)和 ||(條件邏輯或)在執行過程中,有值得注意的地方。

條件邏輯運算有短路特性,當參與運算的表達式有多個時,如果根據計算順序能提前知道結果,則后面的表達式將被忽略,它們不會被計算。

例如語句 if(f1(a, b) || f2(a, b, c)) { // 代碼...},如果 f1(a, b) == true,顯然 if 的條件肯定是成立的,此時 f2(a, b, c) 是不會被執行的。

需要非常清楚這一點,因為 f2 的執行與否,根據實際具體代碼的不同,可能會產生不同的影響。

移位運算的一個實際應用例子

本文示例里面用到的 BitStr 方法,就是通過移位來實現把整數變為二進制字符串的功能。下面是其中的一個主要函數:

C#語言學習筆記10 —— 按位運算和移位運算

此外,和位運算相關的,還有一些重要的內容,如:

(1)運算符優先級。

(2)所有枚舉類型支持 ~、&、| 和 ^ 運算符。

(3)用戶定義的類型可以重載~、<<、>>、>>>、&、| 和 ^ 運算符。

(4)其它內容。

限于篇幅,這里省略,請查看相關文檔。

轉載請注明來自夕逆IT,本文標題:《左移運算符優先級(C語言學習筆記10按位運算和移位運算)》

每一天,每一秒,你所做的決定都會改變你的人生!

發表評論

快捷回復:

評論列表 (暫無評論,96人圍觀)參與討論

還沒有評論,來說兩句吧...

主站蜘蛛池模板: 色爱影院 | 久久亚洲精品视频 | 久久精品国产这里是免费 | 亚洲一区二区三区四区视频 | 亚洲精品不卡久久久久久 | 免费日韩精品 | 水蜜桃一区一区三全集 | 亚洲最大福利视频 | 亚洲天堂男 | 久久亚洲国产成人亚 | 久久精品国产亚洲a不卡 | 欧美日韩国产一区二区三区伦 | 欧美亚洲综合网 | 国产成人精品电影 | 欧美日韩在线视频观看 | 亚洲欧美第一页 | 最新激情网站 | 久久久久国产精品 | 羞羞视频免费入口网站 | 国产日日干 | 九九九国产视频 | 欧美国产成人一区二区三区 | 色月 | 在线视频永久在线视频 | 一区二区三区四区精品 | 亚洲激情网址 | 亚洲免费一级视频 | 亚洲永久精品一区二区三区 | 欧美一区二区三区性 | 羞羞视频免费观看入口 | 国产精品午夜波多野结衣性色 | 深爱激情站| 国产精品久热 | 羞羞视频免费网站在线 | 日本视频中文字幕一区二区 | 欧美日韩不卡码一区二区三区 | 久久久久国产精品免费看 | 国产日本欧美在线观看乱码 | 在线观看国产一区二区三区 | 欧美成人精品手机在线观看 | 福利一区二区 |