《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)(第三版)第12章-位運(yùn)算》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)(第三版)第12章-位運(yùn)算(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第 十 二 章 l 主 要 內(nèi) 容12.1位 運(yùn) 算 符 和 位 運(yùn)算12.2位 運(yùn) 算 舉 例12.3位 段 概 念 l 位 運(yùn) 算 是 指 按 二 進(jìn) 制 位 進(jìn) 行 的 運(yùn) 算 。 因 為 在 系 統(tǒng)軟 件 中 , 常 要 處 理 二 進(jìn) 制 位 的 問(wèn) 題 。l 例 如 : 將 一 個(gè) 存 儲(chǔ) 單 元 中 的 各 二 進(jìn) 制 位 左 移 或 右移 一 位 , 兩 個(gè) 數(shù) 按 位 相 加 等 。l 語(yǔ) 言 提 供 位 運(yùn) 算 的 功 能 , 與 其 他 高 級(jí) 語(yǔ) 言 ( 如PASCAL) 相 比 , 具 有 很 大 的 優(yōu) 越 性 。 4 12.1 位 運(yùn) 算 符 和 位 運(yùn) 算運(yùn) 算
2、 符 含 義 運(yùn) 算 符 含義 按 位 與 取反 | 按 位 或 右移(1)位 運(yùn) 算 符 中 除 以 外 , 均 為 二 目 ( 元 ) 運(yùn) 算 符, 即 要 求 兩 側(cè) 各 有 一 個(gè) 運(yùn) 算 量 。(2)運(yùn) 算 量 只 能 是 整 型 或 字 符 型 的 數(shù) 據(jù) , 不 能 為 實(shí)型 數(shù) 據(jù) 。 語(yǔ) 言 提 供 的 位 運(yùn) 算 符 有 : 5 12.1.1“ 按 位 與 ” 運(yùn) 算 符 ( )按 位 與 是 指 : 參 加 運(yùn) 算 的 兩 個(gè) 數(shù) 據(jù) , 按 二 進(jìn) 制 位 進(jìn)行 “ 與 ” 運(yùn) 算 。 如 果 兩 個(gè) 相 應(yīng) 的 二 進(jìn) 制 位 都 為 , 則 該 位 的 結(jié) 果 值
3、為 ; 否 則 為 。 即 : , , , 例 : 并 不 等 于 , 應(yīng) 該 是 按 位 與 運(yùn) 算 :注 意 : 如 果 參 加 b a; a b; ( ) ( a b的 結(jié) 果 , a已 變 成 )( ) ( b a的 結(jié) 果 , b已 變 成 )( ) ( a b的 結(jié) 果 , a已 變 成 ) 15 執(zhí) 行 前 兩 個(gè) 賦 值 語(yǔ) 句 : “ ; ” 和“ ; ” 相 當(dāng) 于 b=b (a b)。 再 執(zhí) 行 第 三 個(gè) 賦 值 語(yǔ) 句 : 。 由 于a的 值 等 于 ( ) , b的 值 等 于 ( ) , 因 此 , 相 當(dāng) 于 a= ,即 a的 值 等 于 , 等 于 。 得
4、到 原 來(lái) 的 值 。即 等 效 于 以 下 兩 步 : 16 12.1.4 “ 取 反 ” 運(yùn) 算 符 ( ) 是 一 個(gè) 單 目 ( 元 ) 運(yùn) 算 符 , 用 來(lái) 對(duì) 一 個(gè) 二 進(jìn)制 數(shù) 按 位 取 反 , 即 將 變 , 將 變 。 例 如 , 是 對(duì) 八 進(jìn) 制 數(shù) ( 即 二 進(jìn) 制 數(shù) ) 按 位 求 反 。 0000000000010101( ) 1111111111101010 (八 進(jìn) 制 數(shù) 177752) 17 12.1.5 左 移 運(yùn) 算 符 ( ) 左 移 運(yùn) 算 符 是 用 來(lái) 將 一 個(gè) 數(shù) 的 各 二 進(jìn) 制位 全 部 左 移 若 干 位 。 例 如 : a
5、=) 右 移 運(yùn) 算 符 是 a2表 示 將 a的 各 二 進(jìn) 制 位右 移 2位 , 移 到 右 端 的 低 位 被 舍 棄 ,對(duì) 無(wú) 符 號(hào)數(shù) ,高 位 補(bǔ) 0。例 如 : a=017時(shí) : a的 值 用 二 進(jìn) 制 形 式 表 示 為 00001111, 舍 棄 低 2位 11: a2=00000011 右 移 一 位 相 當(dāng) 于 除 以 2 右 移 n位 相 當(dāng) 于 除 以 2n。 20在 右 移 時(shí) ,需 要 注 意 符 號(hào) 位 問(wèn) 題 : 對(duì) 無(wú) 符 號(hào) 數(shù) ,右 移 時(shí) 左 邊 高 位 移 入 0; 對(duì) 于有 符 號(hào) 的 值 ,如 果 原 來(lái) 符 號(hào) 位 為 0(該 數(shù) 為 正
6、),則 左 邊 也 是 移 入 0。 如 果 符 號(hào) 位 原 來(lái) 為 1(即 負(fù)數(shù) ),則 左 邊 移 入 0還 是 1,要 取 決 于 所 用 的 計(jì) 算機(jī) 系 統(tǒng) 。 有 的 系 統(tǒng) 移 入 0,有 的 系 統(tǒng) 移 入 1。 移入 0的 稱 為 “ 邏 輯 右 移 ” ,即 簡(jiǎn) 單 右 移 ; 移 入 1的 稱 為 “ 算 術(shù) 右 移 ” 。 21例 : a的 值 是 八 進(jìn) 制 數(shù) 113755: a:1001011111101101 ( 用 二 進(jìn) 制 形 式 表 示 )a1: 0100101111110110 (邏 輯 右 移 時(shí) )a1: 1100101111110110 (算 術(shù)
7、 右 移 時(shí) ) 在 有 些 系 統(tǒng) 中 ,a1得 八 進(jìn) 制 數(shù) 045766,而 在另 一 些 系 統(tǒng) 上 可 能 得 到 的 是 145766。 Turbo C和 其他 一 些 C編 譯 采 用 的 是 算 術(shù) 右 移 ,即 對(duì) 有 符 號(hào) 數(shù) 右移 時(shí) ,如 果 符 號(hào) 位 原 來(lái) 為 1, 左 面 移 入 高 位 的 是 1。 22 12.1.7 位 運(yùn) 算 賦 值 運(yùn) 算 符 位 運(yùn) 算 符 與 賦 值 運(yùn) 算 符 可 以 組 成 復(fù) 合 賦 值 運(yùn) 算 符 。 例 如 : scanf(“%o”, b=a4; c= ( 04); d=b printf(“%o,%dn%o,%dn”,
8、a,a,d,d);運(yùn) 行 情 況 如 下 : ( 輸 入 ) , 217 ( 的 值 ) , 13 ( 的 值 ) 輸 入 的 值 為 八 進(jìn) 制 數(shù) 331, 其 二 進(jìn) 制 形 式 為 11011001 經(jīng) 運(yùn) 算 最 后 得 到 的 d為 00001101 即 八 進(jìn) 制 數(shù) , 十 進(jìn) 制 數(shù) 13。 26 例 12.2 循 環(huán) 移 位 。要 求 將 進(jìn) 行 右 循 環(huán) 移 位 將 右 循 環(huán) 移 位 ,即 將 中 原 來(lái) 左 面( ) 位 右移 位 , 原 來(lái) 右 端 位 移 到 最 左 面 位 。 27 將 的 右 端 位 先 放 到 中 的 高 位 中 ,實(shí) 現(xiàn) 語(yǔ) 句 : (
9、) ; 將 右 移 位 , 其 左 面 高 位 位 補(bǔ) ,實(shí) 現(xiàn) 語(yǔ) 句 : ; 將 與 進(jìn) 行 按 位 或 運(yùn) 算 , 即 | ;步 驟 : 28 程 序 如 下 :#include void main() unsigned a,b,c; int n; scanf(“a=%o,n=%d”, b=an; c=c|b; printf(“%on%o”,a,c); 運(yùn) 行 情 況 如 下 : , 3 運(yùn) 行 開 始 時(shí) 輸 入 八 進(jìn) 制 數(shù) 157653,即 二 進(jìn) 制 數(shù) 1101111110101011循 環(huán) 右 移 位 后 得 二 進(jìn) 制 數(shù) 0111101111110101即 八 進(jìn) 制
10、數(shù) 75765 29 12.3 位 段 信 息 的 存 取 一 般 以 字 節(jié) 為 單 位 。 實(shí) 際 上 , 有 時(shí)存 儲(chǔ) 一 個(gè) 信 息 不 必 用 一 個(gè) 或 多 個(gè) 字 節(jié) , 例 如 , “ 真 ”或 “ 假 ” 用 或 表 示 , 只 需 位 即 可 。 在 計(jì) 算 機(jī)用 于 過(guò) 程 控 制 、 參 數(shù) 檢 測(cè) 或 數(shù) 據(jù) 通 信 領(lǐng) 域 時(shí) , 控 制信 息 往 往 只 占 一 個(gè) 字 節(jié) 中 的 一 個(gè) 或 幾 個(gè) 二 進(jìn) 制 位 ,常 常 在 一 個(gè) 字 節(jié) 中 放 幾 個(gè) 信 息 。 30(1) 可 以 人 為 地 將 一 個(gè) 整 型 變 量 data分 為 幾 部 分 。
11、 但 是 用 這 種 方 法 給 一 個(gè) 字 節(jié) 中 某 幾 位 賦值 太 麻 煩 。 可 以 位 段 結(jié) 構(gòu) 體 的 方 法 。 怎 樣 向 一 個(gè) 字 節(jié) 中 的 一 個(gè) 或 幾 個(gè) 二 進(jìn) 制 位 賦 值 和 改變 它 的 值 呢 ? 可 以 用 以 下 兩 種 方 法 :( 2) 位 段 C語(yǔ) 言 允 許 在 一 個(gè) 結(jié) 構(gòu) 體 中 以 位 為 單 位 來(lái) 指定 其 成 員 所 占 內(nèi) 存 長(zhǎng) 度 , 這 種 以 位 為 單 位 的 成員 稱 為 “ 位 段 ” 或 稱 “ 位 域 ” ( bit field) 。 利 用 位 段 能 夠 用 較 少 的 位 數(shù) 存 儲(chǔ) 數(shù) 據(jù) 。 3
12、1 程 序 如 下 :struct packed-data unsigned : ; unsigned : ; unsigned : ; unsigned : ; int ; data; 32( 1) 位 段 成 員 的 類 型 必 須 指 定 為 unsigned或 int類 型 。( 2) 若 某 一 位 段 要 從 另 一 個(gè) 字 開 始 存 放 , 可 用 以 下 形式 定 義 :unsigned : 1;unsigned b: ; 一 個(gè) 存 儲(chǔ) 單 元 unsigned: ;unsigned : ; 另 一 存 儲(chǔ) 單 元 a、 b、 c應(yīng) 連 續(xù) 存 放 在 一 個(gè) 存 儲(chǔ) 單
13、元 中 , 由 于 用 了 長(zhǎng)度 為 的 位 段 , 其 作 用 是 使 下 一 個(gè) 位 段 從 下 一 個(gè) 存儲(chǔ) 單 元 開 始 存 放 。 因 此 , 只 將 a、 b存 儲(chǔ) 在 一 個(gè) 存 儲(chǔ)單 元 中 , c另 存 在 下 一 個(gè) 單 元 (“ 存 儲(chǔ) 單 元 ” 可 能 是一 個(gè) 字 節(jié) , 也 可 能 是 2個(gè) 字 節(jié) , 視 不 同 的 編 譯 系 統(tǒng)而 異 )。 關(guān) 于 位 段 的 定 義 和 引 用 的 說(shuō) 明 : 33(3) 一 個(gè) 位 段 必 須 存 儲(chǔ) 在 同 一 存 儲(chǔ) 單 元 中 , 不 能跨 兩 個(gè) 單 元 。 如 果 第 一 個(gè) 單 元 空 間 不 能 容納 下 一 個(gè) 位 段 , 則 該 空 間 不 用 , 而 從 下 一個(gè) 單 元 起 存 放 該 位 段 。(4) 可 以 定 義 無(wú) 名 位 段 。(5) 位 段 的 長(zhǎng) 度 不 能 大 于 存 儲(chǔ) 單 元 的 長(zhǎng) 度 , 也 不能 定 義 位 段 數(shù) 組 。(6) 位 段 可 以 用 整 型 格 式 符 輸 出 。(7) 位 段 可 以 在 數(shù) 值 表 達(dá) 式 中 引 用 , 它 會(huì) 被 系 統(tǒng)自 動(dòng) 地 轉(zhuǎn) 換 成 整 型 數(shù) 。 關(guān) 于 位 段 的 定 義 和 引 用 的 說(shuō) 明 :