C语言程序设计位运算.ppt_第1页
C语言程序设计位运算.ppt_第2页
C语言程序设计位运算.ppt_第3页
C语言程序设计位运算.ppt_第4页
C语言程序设计位运算.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言允许对内存中的字节或字节内的二进制位进行运算,即位运算. 12.1 位运算符和位运算 位运算符共6 种: a = a b ; b = b a ; a = a b ; printf ( “ %d , %d ” ,a , b ) ; 输出: 4 , 3,00000011,00000000,00000100,00000000,00000111,00000000,a,b,a,00000011,00000000,b,00000100,00000000,a,12.1.3 “按位异或”运算符() 作用: 对参加运算的两个二进制数按位进行逻辑异或运算. 规则: 00 = 0, 10 = 1, 01 =

2、1, 11 = 0,结论: 利用异或运算,不必设置第三个变量就可以实现两个整型变量值的交换。,用途:某位“异或”1 要变,某位“异或”0 不变。 1) 使指定位翻转。比如:要使一个字节的低四位翻转,只需异或0 x0f 。,00100011,a,00001111,a,0 x0f,00101100,2) 清零。一个整型(含字符型)数据“异或”自身,便清零.,00100011,a,a,00000000,00100011,a,12.1.4 “按位取反” 运算符() 作用: 对一个二进制数按位取反,是一个单目运算符. 如: a = 15 则 a = 65520,00000000,00001111,111

3、11111,11110000,a, a,注意: 和! 运算符是两个完全不同的运算符。 的优先级与 + +, , !相同,且结合性都是从右至左。 例如:main ( ) int a = 0 , b = 1 ; printf ( “ %d , %d n”, a ,b ) ; printf ( “ %d , %d n”, !a , !b ) ; 运行结果: 1, 2 1, 0,00000000,00000000,11111111,11111111,0, 0,应用举例: 若有一个整数a ,想使它最低一位为0(即屏蔽d0位),而其它位不变。请问如何操作?,方法是: a=a 吗?,答:对于以16位存放一个

4、整型数据的计算机系统,后者也是可以的。但对于以32位(或更多位)存放一个整型数据的系统(如VAX 11/780),后者是不可以的。因此,后者的可移植性很差;而前者则适合于任何系统,程序的可移植性好!,16位整型,32位整型,12.1.5 左移位运算 () 作用: 将操作数的各个二进位顺序左移,右端空出的位补0,而移出左端之外的位则丢失. 如: an 表示将a 的各个二进位顺序左移n 位(n 为正整数). 例如: a=25; 则 a3 的结果为200,00011001,00000000,11001000,00000000,a,a3,说明: (1) 对于无符号数,左移1位,相当于乘2 ;左移n 位

5、,则乘2n。但是此结论只适用于该数左移时被溢出的最高位中没有1的情况。 (2) 对于用补码表示的正数,如果左移出的全部是0 , 且移出后的最高位仍为0 时,数据不会溢出。,(3) 对于用补码表示的负数,如果左移出的全部是1,且移出后的最高位仍为1 时,数据不会溢出。如:,11111110,11111111,11110000,11111111, 2,23,(4) 若非上面(2)、(3)所述情况,则数据左移后会产生溢出,那 就不能简单地用乘2 来计算了。 如: 有符号字符型数据64 , 当它左移2 位时,结果为0 .,00010000,00000000,按位取反加1 得:16,01000000,6

6、4,00000000,642,12.1.6 右移运算符 () 作用: 将操作数的各个二进位顺序右移.左端空出的位补0 或补1,而移出右端的位则被舍去. 如: an 表示将a 的各个二进位顺序右移n 位. 说明: 右移运算的结果与操作数的符号有关. 就Turbo C2.0而言: 1) 无符号数为“逻辑右移”,即左端空出位一律补0 . 2) 有符号数为“算术右移”,即正数右移,空位补0 ,负数右移,空位补1 .一句话,算术右移是指最高位移入符号位。 其它系统对有符号数可能依然采用“逻辑右移”,这随系统而定.,00000000,10000000,00000000,01000000,00000000,

7、11000000,a,a 1,a 1,逻辑右移,结果为 16384,算术右移,结果为 16384,算术右移运算相当于除2 运算。 右移 1 位,相当于除以2 。右移n 位,则除以2n 。,例如: a = 32768,12.1.7 位运算符的优先级与结合性 c = ( 0 n ); d = b ,00000000,11011001,00000000,00001101,a,d,1 0 0 0 1 0 0 1,右移 2 位,0 1 1 0 0 0 1 0,例12.2 将一个整数a 循环右移n 位。所谓循环右移是将a 最右端的位顺序移到a 的最左端,而将a 中原左端的各位顺序右移。,分析: (1) 将

8、a 左移16n 位并存入变量b 中(即用b存放未来的高位)。 b = a (16n),11011111,10101011,01100000,00000000,a,b,(3) 将 c 与 b 按位或运算 c = c | b,(2) 将a 逻辑右移n 位。即原a中的左端16-n位右移了n位且被保留,而高n位变为0。 c = a n,00011011,11110101,c,01111011,11110101,c,main ( ) unsignde a , b , c ; int n ; scanf ( “ %o , %d ” , 如输入: 157653 , 3 输出为: 157653 75765 同

9、样的方法,可以实现循环左移。,11011111,10101011,01111011,11110101,a,c,12.3 位 段,以前,我们内存的存取都是以字节为单位,即信息存储至少要占用一个字节。实际上,有时存储一个信息不必占用一个或多个字节,而只需占用1位或几位便可。这在计算机过程控制和数据通信领域经常会遇到。C语言提供对这方面的处理,而且可用以下两种方法实现:,1、通过位运算实现对1位或几位的操作:比如我们可以人为地将一个字节data划分为几项,假如是四项a、b、c、d,且它们分别占1位、3位、2位、2位(如下图所示)。如果欲将b的值变为6,则可以这样:,data,a,b,c,d,7,0,

10、(1)将b项(4 6位)清零 data = data ,(3)将data与“64”进行按位或运算,即可实现将b的值变为6 。,7,0,(2)将数6左移4位,使110成为4 - 6位,7,0,data,data,|(64),(74),说明:其中(1)步中的0 x8f,称为“屏蔽字”,即把data中b的信息屏蔽掉,而其它信息不受影响。,2、通过位段来实现对1位或几位的操作:C语言允许在一个结构体中以位为单位来指定其成员所占内存的长度,这种以位为单位的成员称为“位段”(或“位域”bit field)。例如:,Struct packed_data unsigned a:2; unsigned b:6;

11、 unsigned c:4; unsigned d:4; int i; data;,Struct packed_data unsigned a:2; unsigned b:3; unsigned c:4; int i; ; Struct packed_data data;,a,b,c,空闲,i,16,7,4,3,2,7,0,15,23,31,关于位段的定义和引用的说明: 1)位段成员的类型必须指定为unsigned int型。 2)若某一位段要从另一存储单元(字)单独开始存放,应这样定义:,Struct packed_data unsigned a:1; unsigned b:2; unsig

12、ned :0; unsigned c:3; /* 在Turbo C中表示c从第3个字节开始存放 */ ;,3)可以定义无名字段,如:,Struct packed_data unsigned a:1; unsigned :2; /* 表示这两位空间不用 */ unsigned b:3; unsigned c:4; ;,4) 一个位段必须存储在同一存储单元(字)中,不能跨越两个单元。如果第一个字不能容纳下一个位段,则该空间不用,而从下一个字开始存放。比如:,Struct packed_data unsigned a:5; unsigned b:6; unsigned c:6; int i; ; Struct packed_data data;,16,6,5,6,5,注意:上面定义的结构体共占6个字节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论