• /  31
  • 下載費用: 9.90積分  

C語言從入門到精通教學課件作者第2版PPT第12章 位運算.ppt

'C語言從入門到精通教學課件作者第2版PPT第12章 位運算.ppt'
位運算位 與 字 節位運算操作符循 環 移 位位 段位 與 字 節位 與 字 節在前面章節中講過數據在內存中是以二進制的形式存放的,下面將具體介紹位與字節之間的關系。位是計算機存儲數據的最小單位。一個二進制位可以表示兩種狀態(0和1),多個二進位組合起來便可表示多種信息。一個字節通常是由8位二進制數組成,當然有的計算機系統是由16位組成,本書中提到的一個字節指的是由8位二進制組成的。因為本書中所使用的運行環境是Visual C++ 6.0,所以定義一個基本整型數據,它在內存中占4個字節,也就是32位;如果定義一個字符型,則在內存中占一個字節,也就是8位。不同的數據類型占用的字節數不同,因此占用的二進制位數也不同。位運算操作符C語言既具有高級語言的特點,又具有低級語言的功能,C語言和其他語言的區別是完全支持按位運算,而且也能像匯編語言一樣用來編寫系統程序。前面講過的都是以字節為基本單位進行運算的,本節將介紹如何在位一級進行運算,按位運算也就是對字節或字中的實際位進行檢測、設置或移位。首先給出C語言提供的位運算符,如表所示?!芭c”運算符按位“與”運算符“&”是雙目運算符,功能是使參與運算的兩數各對應的二進位相“與”。只有對應的兩個二進位均為1時,結果才為1,否則為0,如表所示。例如89&38的算式:#includemain(){ unsigned result; /*定義無符號變量*/ int a, b; printf("please input a:"); scanf("%d",&a); printf("please input b:"); scanf("%d",&b); printf("a=%d,b=%d", a, b); result = a&b; /*計算“與”運算的結果*/ printf("\na&b=%u\n", result);}【實例12.1】 任意輸入兩個數分別賦給a和b,計算a&b的值。計算過程如下:按位“或”運算符“|”是雙目運算符,功能是使參與運算的兩數各對應的二進位相“或”,只要對應的兩個二進位有一個為1,結果位就為1,如表所示:“或”運算符例如17|31的算式:“或”運算符從上式可以發現十進制數17的二進制數的后5位是10001,而十進制數31對應的二進制數的后5位是11111,將這兩個數執行“或”運算之后得到的結果是31,也就是將17的二進制數的后5位中是0的位變成了1,因此可以總結出這樣一個規律,即要想使一個數的后6位全為1,只需和63按位“或”;同理,若要使后5位全為1,只需和31按位“或”即可,其他依此類推。 #includemain(){ unsigned result; /*定義無符號變量*/ int a, b; printf("please input a:"); scanf("%d",&a); printf("please input b:"); scanf("%d",&b); printf("a=%d,b=%d", a, b); result = a|b; /*計算或運算的結果*/ printf("\na|b=%u\n", result);}【實例12.2】 任意輸入兩個數分別賦給a和b,計算a|b的值。計算過程如下(為了方便觀察,這里只給出每個數據的后16位)“取反”運算符“~”為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反,即將0變成1,1變成0。例如~86是對86進行按位求反,如下所示:“取反”運算符#includemain(){ unsigned result; /*定義無符號變量*/ int a; printf("please input a:"); scanf("%d",&a); printf("a=%d", a); result = ~a; /*求a的反*/ printf("\n~a=%o\n", result);}【實例12.3】 輸入一個數賦給變量a,計算~a的值。執行過程如下:按位“異或”運算符“^”是雙目運算符。其功能是使參與運算的兩數各對應的二進位相“異或”,當對應的兩個二進位數相異時結果為1,否則結果為0,如表所示?!爱惢颉边\算符例如107^127的算式:#includemain(){ unsigned result; /*定義無符號數*/ int a, b; printf("please input a:"); scanf("%d",&a); printf("please input b:"); scanf("%d",&b); printf("a=%d,b=%d", a, b); result = a^b; /*求a與b“異或”的結果*/ printf("\na^b=%u\n", result);}【實例12.4】 輸入兩個數分別賦給變量a和b,計算a^b的值執行過程如下:“左移”運算符“<<”是雙目運算符。其功能是把“<<”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,高位丟棄,低位補0。例如a<<2即把a的各二進位向左移動2位。假設a=39,那么a在內存中的存放情況如圖所示?!白笠啤边\算符若將a左移2位,則在內存中的存儲情況如圖所示。#includemain(){ int x=15; x=x<<2; /*x左移3位*/ printf("the result1 is:%d\n",x); x=x<>”是雙目運算符。其功能是把“>>”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。例如a>>2即把a的各二進位向右移動2位。假設a=00000110,右移2位后為00000001,a由原來的6變成了1?!坝乙啤边\算符#includemain(){ int x=30,y=-30; x=x>>3; /*x右移3位*/ y=y>>3; /*y右移3位*/ printf("the result1 is:%d,%d\n",x,y); x=x>>2; /*x右移2位*/ y=y>>2; /*x右移2位*/ printf("the result2 is:%d,%d\n",x,y);}【實例12.6】 將30和-30分別右移3位,將所得結果分別輸出,在所得結果的基礎上再分別右移2位,并將結果輸出。循 環 移 位循 環 移 位前面講過了向左移位和向右移位,這里將介紹循環移位的相關內容。什么是循環移位呢?循環移位就是將移出的低位放到該數的高位或者將移出的高位放到該數的低位。那么該如何來實現這個過程呢?這里先介紹如何實現循環左移。循環左移的過程如圖所示。#include left(unsigned value, int n) /*自定義左移函數*/{ unsigned z; z = (value >> (32-n)) | (value <0):\n"); scanf("%d", &n); /*輸入要移位的位數*/ printf("the result is %o:\n", left(a, n)); /*將左移后的結果輸出*/}【實例12.7】 編程實現循環左移,具體要求如下:首先從鍵盤中輸入一個八進制數,然后輸入要移位的位數,最后將移位的結果顯示在屏幕上。#include right(unsigned value, int n) /*自定義右移函數*/{ unsigned z; z = (value <> n); /*循環右移的實現過程*/ return z;} 【實例12.8】 編程實現循環右移,具體要求如下:首先從鍵盤中輸入一個八進制數,然后輸入要移位的位數,最后將移位的結果顯示在屏幕上。main(){ unsigned a; int n; printf("please input a number:\n"); scanf("%o", &a); /*輸入一個八進制數*/ printf("please input the number of displacement(>0):\n"); scanf("%d", &n); /*輸入要移位的位數*/ printf("the result is %o:\n", right(a, n)); /*將右移后的結果輸出*/}位 段位段的概念與定義位段類型是一種特殊的結構類型,其所有成員的長度均是以二進制位為單位定義的,結構中的成員被稱為位段。位段定義的一般形式為: 結構 結構名{ 類型 變量名1:長度; 類型 變量名2:長度; …… 類型 變量名n:長度;} 一個位段必須被說明是int、unsigned或signed中的一種。一個位段必須被說明是int、unsigned或signed中的一種。例如,CPU的狀態寄存器按位段類型定義如下:struct status { unsigned sign:1; /*符號標志*/ unsigned zero:1; /*零標志*/ unsigned carry:1; /*進位標志*/ unsigned parity:1; /*奇偶溢出標志*/ unsigned half_carry:1; /*半進位標志*/ unsigned negative:1; /*減標志*/ } flags;顯然,對CPU的狀態寄存器而言,使用位段類型僅需1個字節即可。又如:struct packed_data{unsigned a:2;unsigned b:1;unsigned c:1;unsigned d:2;}data;可以發現,這里a、b、c、d分別占2位、1位、1位、2位,如圖所示。位段相關說明前面介紹了什么是位段,這里針對位段有以下幾點加以說明。?因為位段類型是一種結構類型,所以位段類型和位段變量的定義,以及對位段(即位段類型中的成員)的引用,均與結構類型和結構變量相同。?定義一個如下的位段結構:struct attribute{ unsigned font:1; unsigned color:1; unsigned size:1; unsigned dir:1;};小結位運算是C語言的一種特殊運算功能,它是以二進制位為單位進行運算的。本章主要介紹了與(&)、或(|)、取反(~)、異或(^)、左移(<>)這6種位運算符,利用位運算可以完成匯編語言的某些功能,如置位、位清零、移位等。位域在本質上也是結構類型,不過它的成員按二進制位分配內存,其定義、說明及使用的方式都與結構相同。位域可以實現數據的壓縮,節省了存儲空間的同時也提高了程序的效率。
關 鍵 詞:
教學 精通 作者 ppt 入門 12 c語言 運算
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:C語言從入門到精通教學課件作者第2版PPT第12章 位運算.ppt
鏈接地址: http://www.476824.live/p-51617287.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 快3遗漏号码数据查询 上证指数怎么买 浙江20选5走势图(带坐标线 山东十一选五任五最大遗漏 掌上淘股吧股票论坛 大发一分快三精准计划网址 炒股入门视频 2020香港现场开吗 3月27上证指数 七乐彩杀号大全