计算机c语言chap位运算_第1页
计算机c语言chap位运算_第2页
计算机c语言chap位运算_第3页
计算机c语言chap位运算_第4页
计算机c语言chap位运算_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、第11章 位运算11.1 位运算符 C 既具有高级语言的特点,又具有低级语言的功能,位运算能力就是其特色之一。所谓位运算就是指进行二进制位的运算。C提供的位运算符有:运算符 含义 &按位与 按位或 按位异或 取反 右移说明: 位运算符中除“”外,其余均为二目运算符,即要求两侧各有一个运算量。 运算量只能是整型或字符型的数据,不能为实型数据。11.2 “按位与” 运算符 & 参加运算的两个运算量之对应位都为1,则该位的结果为1,否则为0。即:0&0=0 0&1=0 1&0=0 1&1=1例:3&5=13的补码:000000115的补码:00000101& 00000001& 运算符的用途: 清零

2、 如果想将一个单元清零(全部二进位为),则只要找一个数的补码的对应位0与被清零数的对应位1刚好对应,然后使两者进行 & 运算。如:00101011 & 1001010000000000 取一个数中的某些指定位如:a:0010110010101100b:0000000011111111 (377)8& 0000000010101100 得到 a 的低 8 位 保留一个数的某一位如:01010100 (84)10 &00111011 (59)1000010000 (16)1011.3 “按位或”运算符 参加运算的两个运算量之对应位只要有一个为1,则该位的结果为1。即: 0 0 = 0 0 1 =

3、1 1 0 = 1 1 1 = 1如:00110000 (060)8 00001111 (017)800111111 (077)8 即一个数与017进行按位或运算,就可将该数的低4位全置为1;与0377进行按位或运算,就可将该数的低8位全置为1。11.4 “异或”运算符 参加运算的两个运算量的对应位相同,则该位的结果为0。否则为1。即: 0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 0如:00111001 (57)10 、(071)8 00101010 (42)10 、(052)800010011 (19)10 、(023)8 运算符的用途:使指定的位翻转如:01111010 0

4、0001111 对应原数的低4位均置为101110101 原数的低4位被翻转若 a=3, b=4。则a=ab; b=ba;a=ab;结果是什么?11.5 “取反” 运算符 运算是对一个二进制数按位取反,即将0变为1,1变为0。8位全1用377;16位全1用177777;32位全1用37777777777。11.6 “左移”运算符 用来将一个数的各二进制位全部左移若干位,并在右边补若干个0。高位左移后溢出,舍弃不起作用。如: 用来将一个数的各二进制位全部右移若干位,移到右边的低位被舍弃,对无符号数,高位补0。如: a 为00001111,则 a2为00000011 11右移一位相当于除以2 ,右

5、移 n 位相当于除以2 n。(此 2 位被舍弃)注意:在右移时,需要注意符号位问题。若为无符号数,右移时左边高位移入0。若为有符号数,如果原来符号位为0 (正数),则左边移入0 ;如果原来符号位为1 ,左边移入0的称为“逻辑右移” ,移入1的称为“算术右移”。大多数C语言均采用算术移位。如: a:1001011111101101 (113755)8a1:0100101111110110 逻辑右移, 得045766a1:1100101111110110 算术右移, 得14576611.8 位运算举例例11.1 取一个整数 a 从右端开始的 4 7 位。步骤: 先使 a 右移 4 位。即: a(7

6、 4 + 1 ) a4 设置一个低4位全为1,其余全为0 的数。即: ( 0 4;/ b=a(m-n+1) / c = (04);/ c=(0n) / d = b&c; printf(“%on%on”, a, d );运行情况:331 33115例11.2 循环移位。将 a 右循环移 4 位。 将a的右端 n 位放到b的高端n位中。 b = a n ; 将c与b进行按位或运算。 c = c bmain( )unsigned a,b,c; int n; scanf(“a=%o,n=%d”,&a,&n); b = an; c = c b; printf(“%on%on”,a,c);运行情况:a=1

7、57653, n=3 157653 (1101111110101011)275765 (0111101111110101)211.9 位段 有时存储一个信息不必用一个或多个字节,可以在一个字节中存放几个信息。例如, “真”或“假”用1或 0 表示,只需要 1 位就够了。一、 在一个字节中存放几个数据图中:a、b、c、d分别占2位、6位、4位、4位。假定c 原来的值为0,现要变为12,则: 将数 12 左移 4 位,使 1100 成为右边起第 47 位。 将 data 与 124 按位或即可(设 data 中第 47 位原来为0 )。若 c 的原值不为0 ,则应先使 c 为0。方法如下:data

8、 = data & 01774170177417 称为“屏蔽字”当然也可以用:data=data & (154) 来实现,而不必计算屏蔽码。从而可以得到:data=data & (154)(n&15)4; / n为赋给c的值 /二、 位段 位段是以位为单位定义长度的结构体类型中的成员。struct packed_data unsigned a: 2; unsigned b: 6; unsigned c: 4; unsigned d: 4; int i;data;结构体中 a、b、c、d 共占 2 个字节,i 占2个字节。几点说明: 位段也是一种结构体分量,其引用方法与结构体相同。如:data

9、.a = 2;data .b = 3; 长度为 的位段可以使其后的位段从下一个存储单元开始存放。如:unsigned a: 1;unsigned b: 2; / 在一个存储单元 /unsigned : 0;unsigned c: 3; / 另一个存储单元 /必须注意位段分量允许的最大取值范围。允许不允许 一个位段不得跨 2 个存储单元。如:unsigned a : 6;unsigned a : 6;unsigned a : 5;unsigned a : 6;unsigned a : 6;unsigned : 0;unsigned a : 5; 可以定义无名位段。如: unsigned a : 1; unsigned : 2; unsigned b : 3; 一个位段的长度不得大于一个存储单元的长度,也不能定义位段数组。 位段可以用整型格式符输出。如:

温馨提示

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

评论

0/150

提交评论