《C語言程序設(shè)計實(shí)用教程》課件第8章 位操作程序設(shè)計_第1頁
《C語言程序設(shè)計實(shí)用教程》課件第8章 位操作程序設(shè)計_第2頁
《C語言程序設(shè)計實(shí)用教程》課件第8章 位操作程序設(shè)計_第3頁
《C語言程序設(shè)計實(shí)用教程》課件第8章 位操作程序設(shè)計_第4頁
《C語言程序設(shè)計實(shí)用教程》課件第8章 位操作程序設(shè)計_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章位操作程序設(shè)計8.1位運(yùn)算符8.2位域8.3位操作程序設(shè)計綜合舉例8.1位運(yùn)算符6種位運(yùn)算符位與&位或|位異或^位取反~位左移<<位右移>>位運(yùn)算的操作數(shù)為整型(char,short,int,long),運(yùn)算結(jié)果是整型。8.1位運(yùn)算符8.1位運(yùn)算符1.按位與&參與運(yùn)算的兩個值,如果兩個相應(yīng)位都為1,則該位的結(jié)果為1,否則為0。即:0&0=0,0&1=0,1&0=0,1&1=1例如:

8.1位運(yùn)算符1.按位與&用來對操作數(shù)中的若干位置0,或者取操作數(shù)中的若干指定位。例如:charx;(1)將x的第4位和第1位置0,11110110x=x&0xf6;

掩碼0xf6的b3=0,b0=0(2)取x的低4位:x=x&0x0f;掩碼0x0f的b7b6b5b4=0000b3b2b1b0=1111

8.1位運(yùn)算符2.按位或|參與運(yùn)算的兩個值,只要兩個相應(yīng)位中有一個為1,則該位的結(jié)果為1。即:0|0=0,0|1=1,1|0=1,1|1=1例如:

8.1位運(yùn)算符2.按位或|用來把操作數(shù)的某些特定位置1.例如:將int型的變量a的b3、b4位置1:a=a|0x18掩碼:00011000

8.1位運(yùn)算符3

.按位異或^

參與運(yùn)算的兩個值,如果兩個相應(yīng)位不同,則結(jié)果為1,否則為0。

即:0^0=0,1^0=1,0^1=1,1^1=0例如:8.1位運(yùn)算符3.按位異或^使某些特定的位翻轉(zhuǎn)。如果是某位與0異或,結(jié)果是該位的原值;如果是某位與1異或,則結(jié)果與該位原來的值相反。例如:要使11010110的b4、b5翻轉(zhuǎn)將數(shù)與00011000進(jìn)行按位異或運(yùn)算。11010110^00011000

110011108.1位運(yùn)算符4.按位取反~一元運(yùn)算法,對數(shù)據(jù)的每個二進(jìn)制位取反.

即把1變?yōu)?,把0變?yōu)?例如:8.1位運(yùn)算符5.移位<<>>(1)左移運(yùn)算(<<)將一個數(shù)的各個二進(jìn)位全部左移若干位。左移后,低位補(bǔ)0,高位舍棄。一個無符號數(shù),左移一位相當(dāng)于乘以2.(2)右移運(yùn)算(>>)將一個數(shù)的各二進(jìn)制位全部右移若干位。右移后,低位舍棄;高位:若是無符號數(shù),補(bǔ)0;若是有符號數(shù),補(bǔ)“符號位”。一個無符號數(shù),右移一位相當(dāng)于除2取商.

8.1位運(yùn)算符5.移位<<>>某一變量所包含的各二進(jìn)位按指定的方向移動指定的位.例8-1位運(yùn)算的應(yīng)用voidmain(){ unsignedintw1=0x155,w2=0x1c7,w3=0x52; intw4=-128,w5=128; printf("%x%x%x\n",w1&w2,w1|w2,w1^w2); printf("%x%x%x\n",~w1,~w2,~w3); printf("%x%x%x\n",w1^w2,w1&~w2,w1|w2|w3); printf("%x%x\n",w1|w2&w3,w1&w2|w3);printf("%x%x\n",~(~w1&~w2),w1|w2);

printf("%d%d\n",w4>>1,w5<<1);}8.2位域BitField有些信息在存儲時,并不需要占用一個完整的存儲單元,而只需一個或幾個二進(jìn)制位。例如,存放一個開關(guān)量時,只有0和1兩種狀態(tài),只要用一個二進(jìn)位即可。位域:把一個存儲單元中的二進(jìn)制劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。每一個域有一個域名,允許在程序中按域名進(jìn)行操作。8.2位域位域的聲明形式:struct結(jié)構(gòu)體名{

類型1成員1:長度;

類型2成員2:長度;

類型n成員3:長度;}位域變量;8.2位域例如:structBitSeg1{

unsignedchara:4;

unsignedcharb:3;unsignedcharc:1;}flags;聲明位域變量flags由三個成員a、b、c組成,a占有4bits,b占有3bits,c占有1bits,整個變量flags分配的存儲單元大小為char類型的存儲單元,大小為1Byte。8.2位域例如:structBitSeg2{unsignedcharf1:1;unsignedcharf2:1;unsignedcharf3:1;unsignedcharf4:3;unsignedcharf5:7;

//從第二個char型的存儲單元分配成員f5};聲明的結(jié)構(gòu)類型structBitSeg2占用的空間大小為2Bytes。其中成員f1、f2、f3、f4占用第一字節(jié),f5占用第二字節(jié)。例8-2位域的應(yīng)用。typedefstruct{unsignedcharf1:1;unsignedcharf2:1;unsignedcharf3:1;unsignedchartype:4;unsignedcharindex:8;}Flags;voidmain(){Flagsflags;flags.f1=1;flags.f2=0;flags.f3=1;flags.type=0x7;flags.index=0x81;printf("%x%x%x%1x%2x\n",flags.f1,flags.f2,flags.f3,flags.type,flags.index);

printf("Thesizeofvariableflagsis%d\n",sizeof(flags));}101781Thesizeofvariableflagsis28.3位操作程序設(shè)計綜合舉例例8-3將一個無符號八位二進(jìn)制數(shù)的低4位與高4位進(jìn)行交換,并以十六進(jìn)制格式輸出原數(shù)和交換后的結(jié)果。#include<stdio.h>voidmain(){ unsignedcharflag1=0x8f; unsignedcharflag2,flag3,flag4; flag2=flag1&0x0f;//屏蔽高4位后,將低4位送給flag2 flag2=flag2<<4;//將低4位移到高4位

flag3=flag1&0xf0;//屏蔽低4位后,將高4位送給flag3flag3>>=4;//將高4位移到低4位

flag4=flag2|flag3; printf("%x\n",flag1); printf("%x\n",flag4);}8ff8例8-4編寫一個帶參數(shù)的宏clearBit(x,n),用于將x的第n位置0,假設(shè)n>=0。#include<stdio.h>//~(0x1<<n)是第n位是1

溫馨提示

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

評論

0/150

提交評論