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

C語言位移運算符完整指南:左移、右移與實戰範例

     編輯:關於C語言
 

位移運算符基礎

位移運算符將資料視為二進制數,向左或向右移動指定位數。分為左移(<<)與右移(>>),皆為雙目運算子。第一運算元為被移位值,第二運算元為移動位數。

運算規則與補位機制

  • 左移:高位捨棄,低位補 0。
  • 右移:低位捨棄,高位補位規則視資料型別而定:
    • 無符號數:高位補 0(邏輯右移)。
    • 有符號數:高位補原符號位(算術右移),保持正負號不變。

優先序與結合性

  • 算術運算符 > 位移運算符 > 關係運算符
  • 位移運算符同級,結合性為左至右。

範例解析

無符號數範例

unsigned short a = 0x0111; // 二進位 0000 0001 0001 0001
a << 3  // 結果 0x0888 (0000 1000 1000 1000)
a >> 4  // 結果 0x0011 (0000 0000 0001 0001)

有符號數範例

short a = -4; // 二進位 1111 1111 1111 1100 (補碼)
a << 3  // 結果 -32 (1111 1111 1110 0000)
a >> 4  // 結果 -1  (1111 1111 1111 1111) 符號位延伸

C語言左移與右移深度解析

左移細節

  • 左移 1 位相當於乘 2,左移 n 位相當於乘 2^n(有符號數可能因溢位導致符號改變)。
  • 溢位處理:最高位被捨棄。例如 int i = 0x40000000; i << 1 變為 0x80000000(-2147483648),再左移 1 位變為 0。
  • 移位位數超過型別寬度:編譯器通常取模運算。如 32 位 int,i << 33 等同於 i << 1。GCC 會發出警告。

右移細節

  • 有符號數右移保持符號位(算術右移)。正數補 0,負數補 1。
  • 例如 int i = 0x80000000; i >> 1 結果為 0xC0000000,而非 0x40000000。
  • 移位位數超過寬度同樣取模。

位運算符總表

運算符作用
&位邏輯 AND
|位邏輯 OR
^位邏輯 XOR
~位邏輯 NOT (取反)
>>右移
<<左移

按位運算僅適用於字元與整數型別。須區分位運算(&, |)與邏輯運算(&&, ||)。

常見位運算實例

1. 按位 AND (&)

用途:清零特定位、保留特定位。例:a & 255 保留低 8 位。

9 & 5 = 1  (00001001 & 00000101 = 00000001)

2. 按位 OR (|)

用途:設定特定位為 1。例:9 | 5 = 13。

3. 按位 XOR (^)

用途:翻轉特定位、交換兩變數值。例:9 ^ 5 = 12。

4. 取反 (~)

單目運算符,各位取反。~9 = 1111111111110110。

5. 左移 (<<) 與右移 (>>)

已於上文詳細說明。

實用程式碼片段

// 取 a 的第 5 到第 8 位 (共 4 位)
unsigned a, b;
scanf("%u", &a);
b = (a >> 5) & 0xF;  // 先右移 5 位,再用 0xF 保留低 4 位
printf("a=%u\tb=%u\n", a, b);
// 將兩字元合併為一整數
char a='a', b='b';
int p = (a << 8) | b;
int c = (p & 0xFF00) >> 8; // 取高位元組
int d = p & 0xFF;        // 取低位元組

建議

進行位運算時,推薦使用十六進位常數(如 0x01, 0x80),提升可讀性。例如設定字元最高位為 1:a = a | 0x80;。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved