C語言程序設(shè)計第十章位運算(完)_第1頁
C語言程序設(shè)計第十章位運算(完)_第2頁
C語言程序設(shè)計第十章位運算(完)_第3頁
C語言程序設(shè)計第十章位運算(完)_第4頁
C語言程序設(shè)計第十章位運算(完)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十章第十章 位運算位運算 內(nèi)容提要:內(nèi)容提要:位邏輯運算位邏輯運算移位運算移位運算復合位運算復合位運算位段位段 位邏輯運算位邏輯運算 移位運算移位運算 復合位運算復合位運算 位段位段位運算是指對操作數(shù)以二進制位(位運算是指對操作數(shù)以二進制位(bitbit)為為單位進行數(shù)據(jù)加工。單位進行數(shù)據(jù)加工。c c語言的位運算功能有:語言的位運算功能有: 位邏輯運算(四種);位邏輯運算(四種); 位移操作(兩種)。位移操作(兩種)。參加位操作的操作數(shù)必須是整型常量或變量。參加位操作的操作數(shù)必須是整型常量或變量。一、位邏輯運算一、位邏輯運算:位位 邏邏 輯輯 運運 算算 種種 類類運算符運算符名名稱稱例例子

2、子功功能能 位反位反 b b求求b b的位反的位反& &位與位與b & cb & c求求b b和和c c的位與的位與| |位或位或b | cb | c求求b b和和c c的位或的位或 位異或位異或b cb c求求b b和和c c的位異或的位異或運算符運算符名名稱稱例例子子功功能能 位反位反 b b求求b b的位反的位反& &位與位與b & cb & c求求b b和和c c的位與的位與| |位或位或b | cb | c求求b b和和c c的位或的位或 位異或位異或b cb c求求b b和和c c的位異或的位異或運算符運算符運算符運算符名名稱稱名名稱稱例例子子例例子子功功能能功功能能 位反位反位反

3、位反 b b b b求求b b的位反的位反求求b b的位反的位反& & & &位與位與位與位與b & cb & cb & cb & c求求b b和和c c的位與的位與求求b b和和c c的位與的位與| | | |位或位或位或位或b | cb | cb | cb | c求求b b和和c c的位或的位或求求b b和和c c的位或的位或 位異或位異或位異或位異或b cb cb cb c求求b b和和c c的位異或的位異或求求b b和和c c的位異或的位異或1位反運算位反運算位反運算是單項運算,它是把一個操作數(shù)按位反運算是單項運算,它是把一個操作數(shù)按位求反,即操作數(shù)的各個二進制位為位求反,即操作數(shù)的各

4、個二進制位為1 1時變換時變換為為0 0,為,為0 0時變換成時變換成1 1。例例10-110-1:將變量:將變量a a按位求反賦予變量按位求反賦予變量b b。 void main()void main() unsigned char a, b; unsigned char a, b; a=0 x9a; b=a; a=0 x9a; b=a; printf(a:0 x%x b:0 x%xn,a,b); printf(a:0 x%x b:0 x%xn,a,b); void main()void main()unsigned char a, b;unsigned char a, b;a=0 x9a;

5、 b=a;a=0 x9a; b=a;printf(a:0 x%x b:0 x%xprintf(a:0 x%x b:0 x%x n,a,b);n,a,b); 10011010a1001101010011010a運行結(jié)果:運行結(jié)果:a:0 x9a b:0 x65a:0 x9a b:0 x6501100101bb=a0110010101100101bb=a2位與、位或和位異或是對兩個操作數(shù)的對位與、位或和位異或是對兩個操作數(shù)的對應二進制位進行運算。應二進制位進行運算。a a位位b b位位a &b a &b 位與位與a|b a|b 位或位或ab ab 位異或位異或1 11 10 00 01 10 01

6、 10 01 10 00 00 01 11 11 10 00 01 11 10 0a a位位b b位位a &b a &b 位與位與a|b a|b 位或位或ab ab 位異或位異或1 11 10 00 01 10 01 10 01 10 00 00 01 11 11 10 00 01 11 10 0a a位位a a位位b b位位b b位位a &b a &b 位與位與a &b a &b 位與位與a|b a|b 位或位或a|b a|b 位或位或ab ab 位異或位異或ab ab 位異或位異或1 11 10 00 01 11 10 00 01 10 01 10 01 10 01 10 01 10 00

7、 00 01 10 00 00 01 11 11 10 01 11 11 10 00 01 11 10 00 01 11 10 0位位 邏邏 輯輯 運運 算算 種種 類類例例10-2:位邏輯運算。:位邏輯運算。void main()void main()unsigned char a, b;unsigned char a, b;a=0 xb9;a=0 xb9;b=0 x83;b=0 x83;printf(a and b:0 x%xprintf(a and b:0 x%x n,a&b);n,a&b);printf(a and b:0 x%xprintf(a and b:0 x%x n,a|b);

8、n,a|b);printf(a and b:0 x%xprintf(a and b:0 x%x n,ab);n,ab); 運行結(jié)果:運行結(jié)果: a and b:0 x81a and b:0 x81 a and b:0 xbba and b:0 xbb a and b:0 x3aa and b:0 x3a 10111001a:0 xb910000011b:0 x83a&b10000001結(jié)果結(jié)果:0 x811011100110111001a:0 xb91000001110000011b:0 x83a&b1000000110000001結(jié)果結(jié)果:0 x8110111001a:0 xb9100000

9、11b:0 x83a|b10111011結(jié)果結(jié)果:0 xbb1011100110111001a:0 xb91000001110000011b:0 x83a|b1011101110111011結(jié)果結(jié)果:0 xbb0011101000111010結(jié)果結(jié)果:0 x3a1011100110111001a:0 xb91000001110000011b:0 x83ab注意:注意: 對一個操作數(shù)的位運算并不改變操作對一個操作數(shù)的位運算并不改變操作數(shù)本身的數(shù)值。數(shù)本身的數(shù)值。 二、移位操作二、移位操作移位操作是對操作數(shù)以二進制位(移位操作是對操作數(shù)以二進制位(bitbit)為為單位進行左移或右移。它們是雙目運

10、算符。單位進行左移或右移。它們是雙目運算符。形式:形式:操作數(shù)移位運算符移動的操作數(shù)移位運算符移動的位位數(shù)數(shù)運運算算種種類類運算符運算符名稱名稱例子例子運算功能運算功能右移位右移位b3b3b b右移右移3 3位位左移位左移位c2c右移位右移位b3b3b b右移右移3 3位位左移位左移位c2c右移位右移位右移位右移位b3b3b3b3b b右移右移3 3位位b b右移右移3 3位位左移位左移位左移位左移位c2c2c2c2b b左移左移2 2位位b b左移左移2 2位位例例10-3:左移位操作。:左移位操作。void main()void main()unsigned char a, b;unsig

11、ned char a, b;a=0 x1b; a=0 x1b; b=a2;b=a2;printf(0 x%x left_shift 2 bit:0 x%xprintf(0 x%x left_shift 2 bit:0 x%x n,a,b);n,a,b); 運行結(jié)果:運行結(jié)果:0 0 x1b left_shift 2 bit:0 x6cx1b left_shift 2 bit:0 x6c00011011a:0 x1b01101100b:0 x6c舍棄舍棄補零補零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍棄舍棄補零補零b=a2說明:說明:

12、1) 左移位操作中,操作數(shù)移位后,右端出現(xiàn)左移位操作中,操作數(shù)移位后,右端出現(xiàn)的空格補的空格補0,而移至左端之外的位舍去,不,而移至左端之外的位舍去,不管其是否為符號位。管其是否為符號位。00011011a:0 x1b01101100b:0 x6c舍棄舍棄補零補零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍棄舍棄補零補零b=a2說明:說明:2) 每向左移一位,相當于該數(shù)乘每向左移一位,相當于該數(shù)乘2。3)3) 右移位操作與操作數(shù)的數(shù)據(jù)類型是否帶有右移位操作與操作數(shù)的數(shù)據(jù)類型是否帶有符號有關(guān):符號有關(guān):00011011a:0 x1b011

13、01100b:0 x6c舍棄舍棄補零補零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍棄舍棄補零補零b=a2 不帶符號的操作數(shù)右移位時,左端出現(xiàn)的空不帶符號的操作數(shù)右移位時,左端出現(xiàn)的空位補零。位補零。 帶符號的操作數(shù)右移位時,左端出現(xiàn)的空位帶符號的操作數(shù)右移位時,左端出現(xiàn)的空位按原最左端的位復制,無論什么操作數(shù),移按原最左端的位復制,無論什么操作數(shù),移出右端的位被舍棄。出右端的位被舍棄。00011011a:0 x1b01101100b:0 x6c舍棄舍棄補零補零b=a20001101100011011a:0 x1b01101100011

14、01100b:0 x6c舍棄舍棄補零補零b=a2 );printf(unsigned b right_shift 2 bit:%dn, b2 );運行結(jié)果:運行結(jié)果:signed a right_shiftsigned a right_shift 2 bit:-2 2 bit:-2unsigned b right_shiftunsigned b right_shift 2 bit:62 2 bit:62char a=-8;負數(shù)補碼存儲負數(shù)補碼存儲11111000111110001111111011111110舍棄舍棄復制復制a2 帶符號的操作數(shù)右移位時,左端出現(xiàn)的空位帶符號的操作數(shù)右移位時,左

15、端出現(xiàn)的空位按原最左端的符號位復制,無論什么操作數(shù),按原最左端的符號位復制,無論什么操作數(shù),移出右端的位被舍棄。移出右端的位被舍棄。不帶符號的操作數(shù)右移位時,左端出現(xiàn)的空不帶符號的操作數(shù)右移位時,左端出現(xiàn)的空位補零。位補零。unsigned char b=24811111000111110000011111000111110舍棄舍棄補零補零b2unsigned char b=24811111000111110000011111000111110舍棄舍棄補零補零b2說明:說明:4) 每右移一位相當于操作數(shù)除每右移一位相當于操作數(shù)除2。5) a2,b2形式形式的的操作并操作并不不改變操作數(shù)改變操作

16、數(shù)a,b的值;若的值;若a= a2, b= b2則不同。則不同。三、位操作賦值運算(復合位運算)三、位操作賦值運算(復合位運算)運算符運算符名名稱稱例例子子等價于等價于&=&=位與賦值位與賦值a&=ba&=ba=a&ba=a&b|=|=位或賦值位或賦值a|=ba|=ba=a|ba=a|b=位異或賦值位異或賦值a=ba=ba=aba=ab=右移賦值右移賦值a=ba=ba=aba=ab=左移賦值左移賦值a=ba=ba=aba=a=右移賦值右移賦值a=ba=ba=aba=ab=左移賦值左移賦值a=ba=ba=aba=a=右移賦值右移賦值右移賦值右移賦值a=ba=ba=ba=ba=aba=aba=ab

17、a=ab=左移賦值左移賦值左移賦值左移賦值a=ba=ba=ba=ba=aba=aba=aba=a n1; c = ( 0 n1b=value n10 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 00 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 40 41 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0

18、0 0c=(0 4 )c=(0 4 )0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1b b 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 00 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0c c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1d=b&cd=b&c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 00

19、0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0四、位段四、位段就是以位(就是以位(bitbit)位單位定義長度的結(jié)構(gòu)體類型成員。位單位定義長度的結(jié)構(gòu)體類型成員。說明:說明:1)1) 具體使用中應注意成員的所占位,即長度,及其由具體使用中應注意成員的所占位,即長度,及其由長度限定的存取值域。長度限定的存取值域。2)2) 一個位段必須分配在同一個存儲單元之中,不能跨一個位段必須分配在同一個存儲單元之中,不能跨兩個單元,可以兩個單元,可以unsigned:0 unsigned:0 實現(xiàn)從下以個存儲單實現(xiàn)從下以個存儲單元開始存放。元開始存放。3)3) 位段可在數(shù)值表達式中引用,并由系統(tǒng)自動轉(zhuǎn)換為位段可在數(shù)值表達式中引用,并由系統(tǒng)自動轉(zhuǎn)換為整形數(shù),可用整形噶式輸出。整形數(shù),可用整形噶式輸出。例例1-6:位段運算。:位段運算。void main()void main()struct packed_datestruct packed_dateunsigned a:2;unsigned a:2;/結(jié)構(gòu)成員位段結(jié)構(gòu)成員位段a a所占位所占位2 2unsigned b:6;unsigned b:6;/結(jié)構(gòu)成員位段結(jié)構(gòu)成員位段b b所占位所占

溫馨提示

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

評論

0/150

提交評論