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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第十二章1

主要內容12.1位運算符和位運算12.2位運算舉例(自學)12.3位段(不要求)2

概念

位運算是指按二進制位進行的運算。因為在系統(tǒng)軟件中,常要處理二進制位的問題。例如:將一個存儲單元中的各二進制位左移或右移一位,兩個數(shù)按位相加等。C語言提供位運算的功能,與其他高級語言相比,具有很大的優(yōu)越性。312.1位運算符和位運算運算符含義運算符含義

&按位與~取反

|按位或

<<左移∧按位異或

>>右移(1)位運算符中除~以外,均為二目(元)運算符,即要求兩側各有一個運算量。(2)運算量只能是整型或字符型的數(shù)據,不能為實型數(shù)據。C語言提供的位運算符有:

說明:4

12.1.1“按位與”運算符(&)按位與是指:參加運算的兩個數(shù)據,按二進制位進行“與”運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。即:0&0=0,0&1=0,1&0=0,1&1=1例:3&5并不等于8,應該是按位與運算:注意:如果參加&運算的是負數(shù)(如-3&-5),則要以補碼形式表示為二進制數(shù),然后再按位進行“與”運算。

00000011(3)&

00000101(5)

00000001(1)

3&5的值得15按位與的用途:若想對一個存儲單元清零,即使其全部二進制位為0,只要找一個二進制數(shù),其中各個位符合以下條件:原來的數(shù)中為1的位,新數(shù)中相應位為0。然后使二者進行&運算,即可達到清零目的。(1)清零。

00101011&

10010100

00000000

例:6

(2)取一個數(shù)中某些指定位。

如有一個整數(shù)a(2個字節(jié)),想要取其中的低字節(jié),只需將a與8個1按位與即可。0010110010101100abc000000001111111100000000101011007

(3)保留一位的方法:與一個數(shù)進行&運算,此數(shù)在該位?。?。即:a=84,b=59c=a&b=16例:有一數(shù)01010100,想把其中左面第3、4、5、7、8位保留下來,運算如下:

01010100(84)&

00111011(59)

00010000(16)

8

12.1.2“按位或”運算符(|)兩個相應的二進制位中只要有一個為1,該位的結果值為1。即0|0=0,0|1=1,1|0=1,1|1=1例:

060|017,將八進制數(shù)60與八進制數(shù)17進行按位或運算。

00110000|

00001111

00111111

9應用:按位或運算常用來對一個數(shù)據的某些位定值為1。例如:如果想使一個數(shù)a的低4位改為1,只需將a與017進行按位或運算即可。1012.1.3“異或”運算符(∧)異或運算符∧也稱XOR運算符。它的規(guī)則是:若參加運算的兩個二進制位同號則結果為0(假)

異號則結果為1(真)即:0∧0=0,0∧1=1,1∧0=1,1∧1=0即:071∧052=023(八進制數(shù))

00111001∧

00101010

00010011

例:11(1)使特定位翻轉

設有01111010,想使其低4位翻轉,即1變?yōu)椋埃白優(yōu)椋???梢詫⑺c00001111進行∧運算,即:∧運算符應用:

01111010∧

00001111

01110101

運算結果的低4位正好是原數(shù)低4位的翻轉??梢?,要使哪幾位翻轉就將與其進行∧運算的該幾位置為1即可。12因為原數(shù)中的1與0進行∧運算得1,0∧0得0,故保留原數(shù)。例如:012∧00=012(2)與0相∧,保留原值

00001010∧

00000000

0000101013(3)交換兩個值,不用臨時變量例如:a=3,b=4。想將a和b的值互換,可以用以下賦值語句實現(xiàn):a=a∧b;b=b∧a;a=a∧b;a=011(∧)b=100

a=111(a∧b的結果,a已變成7)(∧)b=100

b=011(b∧a的結果,b已變成3)(∧)a=111

a=100(a∧b的結果,a已變成4)14

12.1.4“取反”運算符(~)~是一個單目(元)運算符,用來對一個二進制數(shù)按位取反,即將0變1,將1變0。例如,~025是對八進制數(shù)25(即二進制數(shù)00010101)按位求反。0000000000010101(~)1111111111101010(八進制數(shù)177752)15

12.1.5左移運算符(<<)左移運算符是用來將一個數(shù)的各二進制位全部左移若干位。例如:a=<<2

將a的二進制數(shù)左移2位,右補0。若a=15,即二進制數(shù)00001111,左移2位得00111100,(十進制數(shù)60)

高位左移后溢出,舍棄。16

12.1.5左移運算符(<<)左移1位相當于該數(shù)乘以2,左移2位相當于該數(shù)乘以22=4,15<<2=60,即乘了4。但此結論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。假設以一個字節(jié)(8位)存一個整數(shù),若a為無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。17右移運算符是a>>2表示將a的各二進制位右移2位,移到右端的低位被舍棄,對無符號數(shù),高位補0。例如:a=017時:

a的值用二進制形式表示為00001111,舍棄低2位11:a>>2=00000011右移一位相當于除以2

右移n位相當于除以2n。12.1.6右移運算符(>>)18在右移時,需要注意符號位問題:

對無符號數(shù),右移時左邊高位移入0;對于有符號的值,如果原來符號位為0(該數(shù)為正),則左邊也是移入0。如果符號位原來為1(即負數(shù)),則左邊移入0還是1,要取決于所用的計算機系統(tǒng)。有的系統(tǒng)移入0,有的系統(tǒng)移入1。移入0的稱為“邏輯右移”,即簡單右移;移入1的稱為“算術右移”。19例:

a的值是八進制數(shù)113755:

a:1001011111101101(用二進制形式表示)a>>1:0100101111110110(邏輯右移時)a>>1:1100101111110110(算術右移時)在有些系統(tǒng)中,a>>1得八進制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。TurboC和其他一些C編譯采用的是算術右移,即對有符號數(shù)右移時,如果符號位原來為1,左面移入高位的是1。2012.1.7位運算賦值運算符

位運算符與賦值運算符可以組成復合賦值運算符。例如:&=,|=,>>=,<<=,∧=例:

a&=b相當于a=a&ba<<=2相當于a=a<<221

12.1.8不同長度的數(shù)據進行位運算如果兩個數(shù)據長度不同(例如long型和int型),進行位運算時(如a&b,而a為long型,b為int型),系統(tǒng)會將二者按右端對齊。如果b為正數(shù),則左側16位補滿0;若b為負數(shù),左端應補滿1;如果b為無符號整數(shù)型,則左側添滿0。2212.2位運算舉例(自學)例12.1取一個整數(shù)a從右端開始的4~7位

①先使a右移4位:a>>4

目的是使要取出的那幾位移到最右端

未右移時的情況右移4位后的情況23②設置一個低4位全為1,其余全為0的數(shù)。

~(~0<<4)③將上面①、②進行&運算。

(a>>4)&~(~0<<4)

程序如下:#include<stdio.h>voidmain(){unsigneda,b,c,d;

scanf(“%o”,&a);b=a>>4;c=~(~0<<4);d=b&c;

printf(“%o,%d\n%o,%d\n”,a,a,d,d);}運行情況如下:331(輸入)331,217(a的值)15,13(d的值)輸入a的值為八進制數(shù)331,其二進制形式為11011001

經運算最后得到的d為00001101

即八進制數(shù)15,十進制數(shù)13。24例12.2循環(huán)移位。要求將a進行右循環(huán)移位將a右循環(huán)移n位,即將a中原來左面(16-n)位右移n位,原來右端n位移到最左面n位。25①將a的右端n位先放到b中的高n位中,實現(xiàn)語句:b=a<<(16-n);②將a右移n位,其左面高位n位補0,實現(xiàn)語句:c=a>>n;③將c與b進行按位或運算,即c=c|b;步驟:26程序如下:#include<stdio.h>voidmain(){unsigneda,b,c;

intn;

s

溫馨提示

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

評論

0/150

提交評論