C語言程序設(shè)計(jì)-提高篇-第4章 位運(yùn)算_第1頁
C語言程序設(shè)計(jì)-提高篇-第4章 位運(yùn)算_第2頁
C語言程序設(shè)計(jì)-提高篇-第4章 位運(yùn)算_第3頁
C語言程序設(shè)計(jì)-提高篇-第4章 位運(yùn)算_第4頁
C語言程序設(shè)計(jì)-提高篇-第4章 位運(yùn)算_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C語言程序設(shè)計(jì)

—提高篇第4章位運(yùn)算內(nèi)容概述位運(yùn)算操作位段的概念

教學(xué)目標(biāo)字節(jié)和位的有關(guān)概念;正確使用常見的位運(yùn)算符和位運(yùn)算操作;牢記位段的要領(lǐng)及位段的使用方法。C語言既是一種高級語言,廣泛應(yīng)用于應(yīng)用軟件的開發(fā)和程序設(shè)計(jì),同時(shí)又是一種低級語言,可以用于系統(tǒng)軟件的開發(fā)和程序設(shè)計(jì),如自動(dòng)控制系統(tǒng)中的過程控制、參數(shù)檢測、數(shù)據(jù)通訊等控制程序,都可以綜合利用C語言中的指針操作、位運(yùn)算和位段技術(shù)來實(shí)現(xiàn)。本章介紹位運(yùn)算的基本形式和常用運(yùn)算符,并簡要介紹位段的概念。位運(yùn)算的深入學(xué)習(xí),應(yīng)該在《計(jì)算機(jī)原理》和《匯編語言程序設(shè)計(jì)》課程中進(jìn)行。位運(yùn)算概述所謂“位運(yùn)算”,是指按二進(jìn)制位進(jìn)行運(yùn)算。位運(yùn)算的特點(diǎn):運(yùn)算按二進(jìn)制逐位進(jìn)行——沒有借位和進(jìn)位。位運(yùn)算量:整型(int,short,unsiged,long)/字符型(以補(bǔ)碼/ASCII碼形式存儲(chǔ)),不可為實(shí)型。4.1位運(yùn)算符和位運(yùn)算

位運(yùn)算符(BitwiseOperators)運(yùn)算符名稱舉例優(yōu)先級~按位取反~flag(高)(算術(shù)運(yùn)算符)<<左移a<<2>>右移b>>3(關(guān)系運(yùn)算符)&按位與flag&0x37^按位異或flag^0xC4|按位或flag|0x5A(低)(賦值運(yùn)算符)位運(yùn)算符還可與賦值運(yùn)算符相結(jié)合,進(jìn)行位運(yùn)算賦值操作。如:

a&=b等價(jià)于a=a&ba>>=b等價(jià)于a=a>>b位運(yùn)算時(shí)的數(shù)據(jù)類型為char/int,分析時(shí)要化為二進(jìn)制形式,但在程序中書寫及輸出結(jié)果時(shí)仍為char/int。負(fù)數(shù)以補(bǔ)碼形式參與運(yùn)算注意與邏輯運(yùn)算區(qū)別按位與(BitwiseAND)運(yùn)算規(guī)則0&0=0;0&1=0;1&0=0;1&1=1;用法按位清零保留某些指定位位運(yùn)算符的使用例1#include<stdio.h>voidmain(){

int

a,b;

printf("Enteraandb:");

scanf("%d,%d",&a,&b);

printf("a&b=%d\n",a&b);}計(jì)算

010000(a)&011111(b)010000

001010(a)&010000(b)000000Enteraandb:16,31a&b=16Enteraandb:10,16a&b=0按位或(BitwiseInclusiveOR)運(yùn)算規(guī)則0|0=0;0|1=1;1|0=1;1|1=1;用法按位定值為1例2#include<stdio.h>voidmain(){unsignedchara,b;

printf("Enteraandb:");

scanf("%o,%o",&a,&b);

printf("a|b=%o\n",a|b);}Enteraandb:20,30a|b=30Enteraandb:12,20a|b=32計(jì)算

010000(a)|011000(b)011000

001010(a)|010000(b)011010按位異或(BitwiseExclusiveOR,XOR)運(yùn)算規(guī)則0^0=0;0^1=1;1^0=1;1^1=0;說明相“異”則為1,相“同”則為0例3以下程序的功能是將a數(shù)據(jù)的低4位取反。#include<stdio.h>voidmain(){unsignedchara=0x39,b=

;a=a^b;

printf("%x\n",a);}答案:0x0f

計(jì)算

00111001(a)^00001111(b)00110110與0相異或,保持原值不變與自身相異或,則全部位清零交換兩個(gè)整數(shù)值a=a^b;b=b^a;a=a^b;交換兩個(gè)整數(shù)值不用臨時(shí)變量#include<stdio.h>voidmain(){

inta=3,b=4;a=a^b; b=b^a; a=a^b;

printf(“a=%db=%d\n",a,b);}結(jié)果:a=4b=3按位取反(One'sComplement)運(yùn)算規(guī)則~0=1;~1=0;用法所有位翻轉(zhuǎn)獲得適用于不同系統(tǒng)的位運(yùn)算模板例4#include<stdio.h>voidmain(){

inta=32767;

intb=~a;

printf("a=%d,b=%d\n",a,b);}結(jié)果:a=32767,b=-32768

計(jì)算a:原碼:0111111111111111b:補(bǔ)碼:1000000000000000左移(LeftShift)運(yùn)算規(guī)則i<<n把i各位全部向左移動(dòng)n位最左端的n位被移出丟棄最右端的n位用0補(bǔ)齊用法若沒有溢出,則左移n位相當(dāng)于乘上2n運(yùn)算速度比真正的乘法和冪運(yùn)算快得多例5以下程序的運(yùn)行結(jié)果是

60。#include<stdio.h>voidmain(){ unsignedinta=15,b; b=a<<2;

printf("%d,%d\n",a,b);}例6以下程序的運(yùn)行結(jié)果是

。#include<stdio.h>voidmain(){

inta=12,b; b=0x1f5&a<<3;

printf("%d,%d\n",a,b);}結(jié)果:12,96計(jì)算已知:0x1f5為111110101且:∵a為1100∴a<<3為1100000111110101&001100000001100000=96右移(RightShift)運(yùn)算規(guī)則i>>n把i各位全部向右移動(dòng)n位最右端的n位被移出丟棄最左端的n位用0補(bǔ)齊(邏輯右移)或最左端的n位用符號位補(bǔ)齊(算術(shù)右移)用法右移n位相當(dāng)于除以2n,并舍去小數(shù)部分運(yùn)算速度比真正的除法和冪運(yùn)算快得多例7以下程序的運(yùn)行結(jié)果是

4,5。#include<stdio.h>voidmain(){

inta=16,b=20;

printf("%d,%d",a>>2,b>>2);}應(yīng)用示例①從整數(shù)a最右端第m個(gè)位置開始取該位開始右面n位。算法如下:

b=a>>(m-n+1)c=~(~0<<n)d=b&c

注:位自右向左從0開始編號應(yīng)用示例②將一個(gè)整數(shù)a循環(huán)右移n位。算法如下:b=a<<(16-n)c=a>>nc=c|b

例8:將16進(jìn)制短整數(shù)按二進(jìn)制打印輸出 輸入:F1E2

輸出:1111000111100010

輸入:13A5

輸出:0001001110100101算法思想:從高位到低位逐位測試每一位是0或是1。可順次設(shè)置屏蔽字分別為100000000000

0000、010000000000

0000、……、00000000

00000001,與該數(shù)進(jìn)行&運(yùn)算,從而保留所需的一個(gè)位的狀態(tài)(其余各位為0)。若結(jié)果非零則輸出1,否則輸出0。#include<stdio.h>voidmain(){

inti; shorta;

scanf("%X",&a); for(i=15;i>=0;i--) printf("%1d",a&1<<i?1:0);}C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長度。這種以位為單位的成員稱為“位段”。4.2位段

位段的概念1.位段的含義位段是以位為單位定義長度的結(jié)構(gòu)體類型中的成員.2、位段的構(gòu)成例如:structpack{unsigneda:2;unsignedb:6;unsignedc:8;

intx;}data;這個(gè)結(jié)構(gòu)體類型的變量在內(nèi)存中的情況為:abcx26816也可以使各個(gè)字段不恰好占滿一個(gè)字節(jié)structpack{unsigneda:2;unsignedb:6;unsignedc:4;

intx;}data;則內(nèi)存中的分配形式為:此處:a,b,c共占2個(gè)字節(jié)中的12位,空閑4位,

int型的x從一個(gè)新的字節(jié)開始.abcx26416空閑4對位段中數(shù)據(jù)的引用方法1、方法:通過結(jié)構(gòu)體成員來應(yīng)用:如:data.a=2;data.b=6;2、要點(diǎn):注意每個(gè)字段的最大取值范圍.

如:data.a的取值只能是:0~3,

因?yàn)閮晌欢M(jìn)制最大表示的數(shù)為3. 1.若某個(gè)位段要從新的存儲(chǔ)單元開始,可以這樣定義:structpack{unsigneda:2;unsigned:0;unsignedb:4;unsignedc:4;intx;}data;注意:長度為0的位段的作用是使下一個(gè)位段的內(nèi)容從新的存儲(chǔ)單元開始存放。位段的使用要點(diǎn)位段的使用要點(diǎn)2.一個(gè)位段存儲(chǔ)在同一個(gè)機(jī)器字中,不能跨字存儲(chǔ).如下面的定義是錯(cuò)誤的(假設(shè)機(jī)器的字長為16位)structpack{unsigneda:2;unsignedb:5;unsignedc:10;unsignedd:4;

intx;}data;3.可以定義無名字段structpack{unsigneda:2;unsigned:5;/*空閑不用*/unsignedb:2;unsignedc:4;

intx;}data;位段的使用要點(diǎn)4.位段可以用十進(jìn)制的整型形式輸出,也可以用其他的整型格式輸出(如八進(jìn)制,十六進(jìn)制和無符號),位段以整型的形式參加算術(shù)運(yùn)算.分析下面的程序:例9:voidmain(){structpack{unsigneda:2;unsignedb:3;unsignedc:1;unsignedd:4;unsignede:3;};

union{structpackqp;unsignedi;}abc;

abc.i=255;

printf(“%d\n”,abc.qp.d);}位段的使用要點(diǎn)例10:分析下列程序的輸出結(jié)果#defineN2#defineCUBE(X)(X*X*X)#include<stdio.h>voidmain(){

inti=N+2; i=CUBE(i);

printf("%d\n",i);}運(yùn)行結(jié)果為:64

例11:下列程序的輸出結(jié)果是什么?#include<stdio.h>voidmain(){structequip

{unsigneda:2;

unsignedb:3;

unsignedc:1;

unsignedd:4;

unsignede:3;

unsigned:3;};

union

{structequipeq;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論