首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 位元運算子(二):取補、位移運算與有號/無號差異

     編輯:關於C語言

承接第一部分,本文詳細說明取補 ~與位移 << >>運算子的規則、有號/無號差異與程式碼驗證。

取補運算 ~

對每個位元翻轉:0→1, 1→0。結果數值取決於運算元的靜態型別(有號 vs 無號)。

程式碼驗證


short a = 10;   // 0000 1010
ushort b = 10;
int c = 10;
uint d = 10;

Console.WriteLine(~10);          // -11 (int 常數)
Console.WriteLine($"short: {~a}");   // -11 (short 升級為 int 運算)
Console.WriteLine($"ushort: {~b}");  // -11 (ushort 升級為 int 運算)
Console.WriteLine($"int: {~c}");     // -11
Console.WriteLine($"uint: {~d}");    // 4294967285 (uint 保持無號)

關鍵:short/ushort 進行位元運算時會整數提升為 int,故 ~a、~b 型別為 int,結果為有號 -11。僅 uint 保持無號運算。

位移運算

左移 <<

  • 高位捨棄,低位補 0。
  • 10 << 1 = 20、10 << 2 = 40。

右移 >>:算術 vs 邏輯位移

運算元型別行為
int、long(有號)算術位移:符號位複製(負數補 1,正數補 0)
uint、ulong(無號)邏輯位移:高位補 0

程式碼驗證


int x = 16;  // 0001 0000
x >>= 2;     // 4   (0000 0100)
x >>= 2;     // 1   (0000 0001)
x >>= 2;     // 0

int y = -16; // 1111...0000 (補數)
y >>= 2;     // -4  (1111...1100)
y >>= 2;     // -1  (1111...1111)
y >>= 2;     // -1  (符號位延伸)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved