
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或列舉)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的位運算子
C語言中的位運算子允許對儲存在計算機記憶體中的資料進行低階操作。
C語言中的位運算子與邏輯運算子形成對比。例如,邏輯與運算子(&&)對兩個布林表示式執行與運算,而位與運算子(&)對兩個運算元的每個對應位執行與運算。
對於三個邏輯運算子&&、||和!,C語言中對應的位運算子分別為&、|和~。
此外,符號^(異或)、<<(左移)和>>(右移)是其他位運算子。
運算子 | 描述 | 示例 |
---|---|---|
& | 二進位制與運算子如果位在兩個運算元中都存在,則將其複製到結果中。 | (A & B) |
| | 二進位制或運算子如果位在任一運算元中存在,則將其複製。 | (A | B) |
^ | 二進位制異或運算子如果位在一個運算元中設定,但在另一個運算元中沒有設定,則將其複製。 | (A ^ B) |
~ | 二進位制一補碼運算子是一元運算子,其作用是“翻轉”位。 | (~A |
<< | 二進位制左移運算子。左運算元的值向左移動右運算元指定的位數。 | A << 2 |
>> | 二進位制右移運算子。左運算元的值向右移動右運算元指定的位數。 | A >> 2 |
儘管這些運算子作用於單個位,但它們需要運算元以C資料型別或變數的形式出現,因為變數在記憶體中佔用特定數量的位元組。
C語言中的位與運算子 (&)
位與 (&) 運算子根據以下真值表執行操作:
位 a | 位 b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
位二進位制與對數字在其二進位制形式中每個位置的位執行邏輯運算。
假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a & b”操作的結果為13,根據其對應位的位與運算,如下所示:
0011 1100 & 0000 1101 --------- = 0000 1100
二進位制數00001100對應十進位制數12。
位或 (|) 運算子
位或 (|) 運算子根據以下真值表執行操作:
位 a | 位 b | a | b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
位二進位制或對數字在其二進位制形式中每個位置的位執行邏輯運算。
假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a | b”的結果為61,根據其對應位的位或運算,如下所示:
0011 1100 | 0000 1101 --------- = 0011 1101
二進位制數00111101對應十進位制數61。
位異或 (^) 運算子
位異或 (^) 運算子根據以下真值表執行操作:
位 a | 位 b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
位二進位制異或對數字在其二進位制形式中每個位置的位執行邏輯運算。異或運算稱為“互斥或”。
注意:僅當一個運算元為1時,異或的結果才為1。與或不同,如果兩個位都為1,則異或的結果為0。
假設兩個int變數“a”和“b”的值分別為60(在二進位制中相當於0011 1100)和13(在二進位制中相當於0000 1101),則“a ^ b”操作的結果為49,根據其對應位的位異或運算,如下所示:
0011 1100 ^ 0000 1101 --------- = 0011 0001
二進位制數00110001對應十進位制數49。
左移 (<<) 運算子
左移運算子用<<符號表示。它將左運算元中的每個位向左移動右運算元指示的位數。移位時產生的任何空白都將用零填充。
假設int變數“a”的值為60(在二進位制中相當於0011 1100),則“a << 2”操作的結果為240,根據其對應位的位左移運算,如下所示:
0011 1100 << 2 = 1111 0000
二進位制數11110000對應十進位制數240。
右移 (>>) 運算子
右移運算子用>>符號表示。它將左運算元中的每個位向右移動右運算元指示的位數。移位時產生的任何空白都將用零填充。
假設int變數a的值為60(在二進位制中相當於0011 1100),則“a >> 2”操作的結果為15,根據其對應位的位右移運算,如下所示:
0011 1100 >> 2 = 0000 1111
二進位制數00001111對應十進位制數15。
一補碼 (~) 運算子
C語言中的一補碼運算子 (~) 是一元運算子,只需要一個運算元。它具有“翻轉”位的作用,這意味著1將替換為0,反之亦然。
a | ~a |
---|---|
0 | 1 |
1 | 0 |
假設int變數“a”的值為60(在二進位制中相當於0011 1100),則“~a”操作的結果為以二進位制補碼形式表示的-61,根據其對應位的位右移運算,如下所示:
~ 0011 1100 = 1100 0011
二進位制數1100 0011對應十進位制數-61。
示例
在本例中,我們重點介紹了所有位運算子的操作。
#include <stdio.h> int main(){ unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("Line 1 - Value of c is %d\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("Line 2 - Value of c is %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Line 3 - Value of c is %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("Line 4 - Value of c is %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Line 5 - Value of c is %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Line 6 - Value of c is %d\n", c ); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Line 1 - Value of c is 12 Line 2 - Value of c is 61 Line 3 - Value of c is 49 Line 4 - Value of c is -61 Line 5 - Value of c is 240 Line 6 - Value of c is 15