第12章 位运算1_第1页
第12章 位运算1_第2页
第12章 位运算1_第3页
第12章 位运算1_第4页
第12章 位运算1_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、第12章 位运算,12.1 位运算符和位运算 12.2 位段,12.1 位运算符和位运算,概念 位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。 例如: 将一个存储单元中的各二进制位左移或右移。,12.1 位运算符和位运算,语言提供的位运算符有:,说明: 位运算符中除以外,均为双目运算符。 运算量只能是整型或字符型的数据,不能为实型数据。,12.1.1 “按位与”运算符( and = a ,运行结果: 1,12.1.1 “按位与”运算符( or = a|b; printf( %on, or ); ,运行结果: 77,应用:,常用来对一个数据的某些位定值为1。 例如:想

2、使一个数的低位改为1,只需将这个数与017进行“按位或” 运算即可。,12.1.3 “异或”运算符(),“异或” 判断两个相应的位值是否为“异”(不同),为“异”就取真(1);否则,为假(0)。 运算规则:,0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 0,12.1.3 “异或”运算符(),例如: 071052=?,【例12.3 】 #include void main() int a = 071, b=052, xor; xor = ab; printf( %on, xor ); ,运行结果: 23,应用:,使特定位翻转 要使哪几位翻转就将相应位与1进行“ 运算” 。 例如:设

3、有,想使其低位翻转。,应用:,与0相,保留原值 因为原数中的1与0进行运算得1,00得0,故保留原数。 例如: 01200=012,应用:,交换两个值,不用临时变量 例如:a=3,b=4,想将a和b的值互换,可以用以下赋值语句实现: a = ab; b = ba; a = ab;,12.1.4 “取反”运算符(),是一个单目运算符, 用来对一个二进制数按位取反,即将变,将变。 运算规则:, 0 = 1 1 = 0,12.1.4 “取反”运算符(),例如: 025=?,12.1.5 左移运算符(),左移运算符: 是用来将一个数的各二进制位全部左移若干位,右补。 例如: a = 15; a = a

4、2;/将a的二进制数左移2位,15,60,说明:,高位左移后溢出,舍弃。 左移一位,相当于该数乘以2。左移n位,相当于该数乘以2n。 只适用于该数左移时被溢出舍弃的高位中不包含1的情况。,12.1.6 右移运算符(),右移运算符: 将一个数的二进制位右移若干位,移到右端的低位被舍弃,对无符号数,高位补0。 例如: a = 017; a = a2;,15,3,说明:,右移一位相当于除以2,右移n位相当于除以2n。 在右移时,需要注意符号位问题。 对无符号数,左边高位补0; 对于有符号数,左边补0还是1,要取决于所用的计算机系统。 Turbo C采用“算术右移”的方法:左边高位补符号位。,说明:,

5、例: int a=0113755; a = a1;,0113755,0145766,12.1.7 位运算赋值运算符,位运算符与赋值运算符组成复合赋值运算符。 int b; 若b为正数,则左侧16位补满0; 若b为负数,左端应补满1; 若b为无符号整数型,则左侧补满0。,【例12.4 】取一个整数a从右端开始的47位,分析: 先使a右移4位:b = a 4 设置一个低4位全为1,其余全为0的数: c = (04) 将上面b、c进行 scanf( %o, ,运行情况如: 331 331,217 15,13,0331,015,【例12.5 】循环移位。,要求将a进行右循环移位,如图所示。 将a右循环

6、移n位,即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。,【例12.5 】循环移位。,分析: 将a的右端n位先放到b中的高n位: b = an; 将c与b进行“按位或”运算: c = c|b;,【例12.5 】循环移位。,#include void main() unsigned int a, b, c; int n; scanf( %o%d, ,运行情况: 157653 3 157653 75765,0157653,075765,12.2 位段,在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位。 位段 C语言允许在一个结构体中

7、以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” ( bit field) 。 利用位段能够用较少的位数存储数据。,12.2 位段,例如:,struct packed-data/位段类型 unsigned a:2; /a占2位 unsigned b:6;/b占6位 unsigned c:4;/c占4位 unsigned d:4;/d占4位 int i; data;/位段变量,说明:,因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。 例如: data.a = 2; data.b = 7;

8、 data.c = 9;,说明:,对位段赋值时,要注意取置范围。 一般地说,长度为n的位段,其取值范围是:0(2n-1) 例如: data.a = 2; data.a = 8;,说明:,位段成员的类型必须指定为unsigned或int类型。 一个位段必须存储在同一存储单元中,不能跨两个单元。 如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。,说明:,若某一位段要从另一存储单元开始存放,可用以下形式定义:,unsigned a:1; unsigned b:2;/一个存储单元 unsigned :0; unsigned c:3;/另一存储单元,说明:,可以定义无名位段。,unsigned a:1; unsigned :2;/这两位空间不用unsigned b:3; unsigned c:4;,说明:,位段可以用整型格式符输出。 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。,【例12.6 】位段程序举例。,#include struct bit_segment unsigned a:1; unsigned b:3; unsigned c:4; bit, *p

温馨提示

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

评论

0/150

提交评论