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

下載本文檔

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

文檔簡介

1第11章位運(yùn)算位運(yùn)算簡介位賦值運(yùn)算符位段應(yīng)用舉例23.位運(yùn)算有:

“按位與”運(yùn)算“按位或”運(yùn)算“異或”運(yùn)算“取反”運(yùn)算左移運(yùn)算右移運(yùn)算11.1位運(yùn)算簡介

1.位運(yùn)算和指針一樣,都是C語言的重要特色。

2.位運(yùn)算的概念:

所謂位運(yùn)算,是指進(jìn)行二進(jìn)制位的運(yùn)算。例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移1位,兩個(gè)數(shù)按位相加等。位運(yùn)算符含義舉例&按位與a&b|按位或a|b∧按位異或a∧b~按位取反~a<<左移a<<1>>右移b>>23

位賦值運(yùn)算符是位運(yùn)算符與賦值運(yùn)算符的結(jié)合。位賦值運(yùn)算符含義舉例等同于&=位與賦值a&=ba=a&b|=位或賦值a|=ba=a|b∧=位異或賦值a∧=ba=a∧b<<=左移賦值a<<=ba=a<<b>>=右移賦值a>>=ba=a>>b11.2位賦值運(yùn)算符4

C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指定其成員所占的內(nèi)存長度,這種以位為單位的成員稱為“位段”或“位域”。“位段”或“位域”是一種特殊的結(jié)構(gòu)體成員。

11.3位段定義的一般格式如下:struct結(jié)構(gòu)體名{

類型成員1:長度;

類型成員2:長度;…

類型成員n:長度;};其中,冒號(hào)前的成員為位段,冒號(hào)后的長度表示存儲(chǔ)位段需要占用字節(jié)的位數(shù)。5例如:structdevice{unsigneda:1;unsignedb:2;unsignedc:4;shortx;floaty;}data;11.3位段結(jié)構(gòu)體變量data包含5個(gè)成員,它們分別是a、b、c、x、y。其中,a、b、c為位段,分別占用1位、2位、4位,即a、b、c共占用7位。這樣,用一個(gè)字節(jié)就可以存儲(chǔ)這3個(gè)位段。x、y為基本類型的成員,分別需要2個(gè)、4個(gè)字節(jié)存儲(chǔ)。因此,結(jié)構(gòu)體變量data需要占用7個(gè)字節(jié)的內(nèi)存單元。上圖給出了結(jié)構(gòu)體變量data的每個(gè)成員在內(nèi)存中的分配情況。

14211個(gè)字節(jié)2個(gè)字節(jié)4個(gè)字節(jié)xycba1632610.4應(yīng)用舉例

程序:main(){intnum,bit,i;unsignedtest=0x8000;printf("inputmum:");scanf("%d",&num);printf("binaryof%xis:",num);for(i=1;i<=16;i++){bit=((num&test)==0)?0:1;printf("%d",bit);test>>=1;}}

運(yùn)行結(jié)果:inputnum:12345↙binaryof3039is:0011000000111001例1輸出一個(gè)整數(shù)的二進(jìn)制形式。710.4應(yīng)用舉例

題目分析:①利用某位與1進(jìn)行異或可將該位翻轉(zhuǎn)的特性,設(shè)置一個(gè)掩碼mask,mask中的數(shù)據(jù)最好不能從鍵盤上直接輸入,以避免mask碰巧與源碼(輸入的字符串)相同、進(jìn)行按位“異或”運(yùn)算、結(jié)果為0、無法進(jìn)行加密和解密的情況(如"123abc"∧"123abc"=0)。為此,查ASCII字符編碼一覽表(附錄A),選取mask="\x14\x15"。②上面的\x14和\x15的十進(jìn)制分別是20和21,分別代表?和§,它們無法從鍵盤上直接輸入。其二進(jìn)制分別為:0000000000010100和0000000000010101。③編寫strencrypt函數(shù)。該函數(shù)有兩個(gè)形參:一個(gè)是源碼——要加密/解密的字符串,一個(gè)是掩碼——加密使用的mask。使用循環(huán)結(jié)構(gòu)將需要加密/解密的字符串不斷與掩碼mask的對(duì)應(yīng)二進(jìn)制位進(jìn)行多輪次的按位“異或”運(yùn)算,直到加密/解密的字符串結(jié)束,完成字符串的加密/解密。

例2編寫一函數(shù),實(shí)現(xiàn)字符串(例如用戶使用的密碼)的加密和解密。810.4應(yīng)用舉例

程序:#include"stdio.h"#defineMASK"\x14\x15" /*定義一個(gè)加密/解密的mask*/char*strencrypt(charstr[],charmask[])/*對(duì)字符串進(jìn)行加密/解密*/{inti,j;for(i=0;str[i]!=0;) /*循環(huán)到加密/解密字符串結(jié)束*/for(j=0;str[i]!=0&&mask[j];j++,i++)/*循環(huán)到加密/解密字符串或mask字符串結(jié)束*/{str[i]=str[i]^mask[j]; /*按位“異或”*/}return(str);}main(){charstr[80];printf("Inputastring:");scanf("%s",str); /*輸入一個(gè)要加密/解密的字符串*/strencrypt(str,MASK); /*加密*/printf("Encryptstringis:%s\n",str); /*輸出加密后的字符串*/strencrypt(str,MASK); /*解密*/printf("ReEncryptstringis:%s\n",str); /*輸出解密后的字符串*/}運(yùn)行結(jié)果:Inputastring:ac#@^

溫馨提示

  • 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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論