C语言程序设计教程课件 第11章-位运算_第1页
C语言程序设计教程课件 第11章-位运算_第2页
C语言程序设计教程课件 第11章-位运算_第3页
C语言程序设计教程课件 第11章-位运算_第4页
C语言程序设计教程课件 第11章-位运算_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第11章位运算本章主要内容1.按位取反运算2.按位左移运算3.按位左移运算4.按位与运算5.按位或运算6.按位异或运算7.复合位运算第11章位运算C语言提供的位运算符共有6个:运算符含

义优先级表达式样例~按位取反14~a<<按位左移11a<<4>>按位右移11a>>4&按位与8a&b^按位异或7a^b|按位或6a|b第11章位运算11.1按位取反运算

按位取反表达式:~mi的二进制表示为:i=(85)10=(0000000001010101)2对i按位取反:

~i=(1111111110101010)2

此时,~i的最高位为1,代表负数。为原数的补码形式。实际上:~i=(1111111110101010)2|

反码+1=(1000000001010101)2+1=(1000000001010110)2

=-86(注:负数取反时。符号位不变)

作用:对m的二进制值按位取反,即将1变成0,将0变成1。

例如,若有:inti=85;11.1按位取反运算

对于无符号整型数:unsignedinti=85;i的二进制表示为:

i=(85)10=(0000000001010101)2对i按位取反:~i=(1111111110101010)2

此时,~i的最高位为1,仍然代表正数。

因此,~i值就是i按位取反后的值:

~i=(1111111110101010)2

=(65450)1011.1按位取反运算

小结:(1)C语言允许对有符号整型数进行位运算

缺点:不便于掌控程序本身的计算结果。(2)位运算适合于无符号的整型数对于需要进行位运算操作的数据,通常应定义成unsigned型。(3)位运算符不适合于浮点型数据。11.1按位取反运算例1:阅读【例11-1】的程序,了解不同类型的变量进行按位取反运算的规则。/*example11_1.c了解按位取反运算的规则*/#include<stdio.h>intmain(){inti1=32767,i2=-32767,i3=10,i4=-10,i;unsignedintu1=65535,u2=0,u3=10,u;printf("i1=%d,~i1=%d\n",i1,~i1);printf("i2=%d,~i2=%d\n",i2,~i2);printf("i3=%d,~i3=%d\n",i3,~i3);printf("i4=%d,~i4=%d\n",i4,~i4);printf("u1=%u,~u1=%u\n",u1,~u1);printf("u2=%u,~u2=%u\n",u2,~u2);printf("u3=%u,~u3=%u\n",u3,~u3);return0;}

思考和分析程序的运行结果。11.2按位左移运算

按位左移表达式的形式:m<<n;

作用:将m的二进制位全部左移n位,右边空出的位补零。

高位左移后溢出,舍弃不起作用。若有:unsignedintm=65;即:m=(65)10=(0000000001000001)2则:m<<2=

000000000100000100↘丢弃↘补入于是:m<<2=(0000000100000100)2=26011.2按位左移运算

对于有符号的整型数,符号位是保留的。若有:intn=−65即:n=(−65)10=(1000000001000001)2实际计算时,是对其补码进行运算的:

1111111110111110→−65的反码

+0000000000000001

1111111110111111→−65的补码

(n)补<<1=(1

111111101111110)补码↘保留

↘补入因此:n<<1=(1111111101111110)补码

=(1000000010000010)2

=−13011.2按位左移运算

小结:

按位左移1位相当于原操作数乘以2;

因此,左移n位,相当于操作数乘以2n。例2:阅读【例11-2】的程序,了解按位左移运算的规则作用。

思考:按位左移的意义是什么,有什么限制?

思考:若整型数的字节长度为2个字节(16位),

请分析下面的几种情况:(1)n为有符号整型变量,且n为偶数时,语句:n<<15;会是什么结果?(2)n为有符号整型变量,且n为奇数时,语句:n<<15;会是什么结果?11.3按位右移运算

按位右移表达式的形式:m>>n;作用:将m的二进制位全部右移n位。

左边空出的位,分两种情况处理:

①m为正数,则m右移n位后,左边补n个零;

②n为负数,则m右移n位后,左边补n个符号位。正整数情况:unsignedintm=65;即:m=(65)10=(0000000001000001)2则:m>>2=

000000000001000001↘补入↘丢弃于是:m>>2=(0000000000010000)2=1611.3按位右移运算负整数情况:n=(−65)10=(1000000001000001)2在计算机中,−65的补码为:1111111110111111(n)补>>2=111111111110111111

↘补入

↘丢弃即:n>>2=(1111111111101111)补=(1000000000010001)2=−1711.3按位右移运算>>小结

在C语言中,按位右移后左边补零的情况称为“逻辑右移”,

左边补1的情况称为“算术右移”。

亦即,对于整型变量m:

若m>0,则m>>n为逻辑右移,

运算结果为m/2n;

若m<0,则m>>n为算术右移。运算结果为(m/2n)+1;11.3按位右移运算例3:阅读【例11-3】的程序,了解按位右移运算的规则和作用。思考和分析:从程序的运行结果了解按位右移的运算规则。思考:(1)请分析逻辑右移和算术右移的不同之处;(2)请分析逻辑右移和算术右移运算时应注意些什么。11.4按位与运算运算规则:

若a、b的值对应位都为1,则该位的结果为1,否则为0。即: 0&0=00&1=01&0=01&1=1若有:unsignedinta=73,b=21;即:a=(73)10=(0000000001001001)2b=(21)10=(0000000000010101)2。0000000001001001→a的二进制值

&0000000000010101→b的二进制值0000000000000001→

a&b结果:a&b=(0000000000000001)2=1

按位与表达式的一般形式:a&b作用:将变量a、b的二进制值按位进行与运算。11.4按位与运算对于有符号的整型数,若有:inta=73,b=−21;

对负数需要用其补码来计算b|原码=(−21)10=(1000000000010101)b|补码=1111111111101011于是:0000000001001001→a的二进制值

&1111111111101011→b的补码0000000001001001→a&b结果:a&b=(0000000001001001)2=73。11.4按位与运算小结(1)按位与运算的结果并不是很容易的能直观判断;(2)实际应用中常常是利用按位与运算的特点,进行一些特殊的操作,如清零、屏蔽等。思考(1)怎样实现对数据实现“清零”?(2)怎样通过“屏蔽”的方法实现对某数据的指定字节进行保留或提取?例4:阅读【例11-4】的程序,了解按位与运算的规则和作用。思考:按位与运算的主要功能和作用有那些?11.5按位或

运算运算规则:

若a、b的值对应位有1,则该位的结果为1,否则为0。即: 0|0=00|1=11|0=11|1=1

按位或表达式的一般形式:a|b作用:将变量a、b的二进制值按位进行或运算。若有:unsignedinta=73,b=21;即:a=(73)10=(0000000001001001)2b=(21)10=(0000000000010101)2。0000000001001001→a的二进制值

|0000000000010101→b的二进制值0000000001011101→

a|b结果:a|b=(0000000001011101)2=9311.5按位或

运算

对于有符号的整型数,若有:inta=73,b=−21;

对负数需要用其补码来计算b|原码=(−21)10=(1000000000010101)b|补码=1111111111101011于是:0000000001001001→a的二进制值

|1111111111101011→b的补码

1111111111101011→a|b的补码结果:a|b=(1000000000010101)2=−21。

注意:a|b的补码并不是最后的结果,结果为其反码。11.5按位或

运算小结(1)与0进行“按位或”运算的结果将保持自身的值不变;与l进行“按位或”运算的结果将变成1。(2)实际应用时,可用来提取变量某些字节的值或将变量某些字节的值变为1。例如:

a的二进制值为:xxxxxxxxxxxxxxxx(x表示即可为0也可为1)b的二进制值为:0000000011111111a|b的二进制值:xxxxxxxx

1111

1111例5:请编写程序,从键盘输入一个无符号的整型数x,将x从低位数起的奇数位全部换成1(如果原来该位值为1,则仍为1不变),偶数位保持不变。参考程序:【例11-5】的程序example11_5.c思考和分析:按位或运算的主要功能和作用有哪些?11.6按位异或

运算运算规则:

若a、b对应位的值相同,则该位的结果为0,否则为1。即: 0^0=00^1=11^0=11^1=0

按位异或表达式的一般形式:a^b作用:将变量a、b的二进制值按位进行异或运算。若有:unsignedinta=73,b=21;即:a=(73)10=(0000000001001001)2b=(21)10=(0000000000010101)2。0000000001001001→a的二进制值

^0000000000010101→b的二进制值0000000001011100→

a^b结果:a^b=(0000000001011100)2=9211.6“按位异或”运算^

对于有符号的整型数,若有:inta=73,b=−21;

对负数需要用其补码来计算b|原码=(−21)10=(1000000000010101)b|补码=1111111111101011于是:000000000100

1001→a的二进制值

^1111111111101011→b的补码

1111111110100010→a^b的补码结果:a^b=(1000000001011110)2=−94。

注意:a^b的补码并不是最后的结果,结果为其反码。11.6按位异或

运算小结(1)任何二进制值与0相“异或”时,其值保持不变;

与1相“异或”时,其值取反。(2)实际应用时:可实现对指定位的二进制值取反;

或对指定位的二进制值保持不变。思考(1)怎样通过异或运算实现交换两个变量的值?(2)编写程序,将两个无符号的整数x和y从低位数开始的奇数位上的值取反,偶数位上的值保持不变,改变后再交换两变量的值。11.6按位异或

运算例6:阅读【例11-6】的程序,了解按位异或运算的规则和作用。参考程序:【例11-6】的程序example11_5.c思考和分析:

1.按位异或运算的主要功能和作用有哪些?

2.实际应用可用来实现什么功能?

11.7复合位运算符

位运算符和赋值运算符一起可以组成复合位运算赋值运算符。运算符表达式等价的表达式&=a&=b;a=a&b;|=a|=b;a=a|b;<<=a<<=b;a=a<<b;>>=a>>=b;a=a>>b;^=a^=b;a=a^b;11.8程序范例【例11-7】

在互联网络中,计算机都是通过IP地址进行通信的,计算机中的每一个IP地址都用一个32位的unsignedlong型变量保存,它分别记录了这台计算机的网络ID和主机ID。请编写程序,从一个正确的IP地址中分离出它的网络ID和主机ID。分析:一个32位的IP地址可以分解成4个字节,每一个字节代表了IP地址的段,如202.103.96.68就代表了一个合法的IP地址。若用ip表示某计算机的IP地址,用mask表示其子网掩码。则:ip&mask即可获得该计算机的网络ID;其主机ID为:ip-(ip&mask)。11.8程序范例用sect1~sect4代表IP地址从高到低4个字节的值;ip代表计算机的IP地址;netmask代表计算的子网掩码;netid和hostid分别代表计算机的网络IP和主机IP。IP地址和子网掩码的值都通过键盘输入来模拟获取。函数:unsignedlonggetIP()来获取IP和子网掩码的值。参考程序:【例11-7】的程序example11_7.c思考和分析:

1.分析函数getIP()的算法思想,其中主要功能和作用有哪些?

2.能否修改程序也能完成程序的功能?

11.8程序范例【例11-8】

编写程序,设计函数unsignedpower2(unsignednumber,unsignedpow),通过调用函数,计算number×2pow。将计算结果返回并分别用整数形式和二进制形式输出。分析:number×2pow相当于将number乘以pow个2。如5×23,相当于5×2×2×2。而对于无符号整型变量,左移1位相当于将其乘以2,因此,计算number×2pow的值可采用按位左移表达式进行运算:number=number<<pow;

参考程序:

example11_8.c思考和分析程序的算法,修改程序换一种算法来实现。11.8附加程序范例(可略)拓展思考例1:编写程序,取一整型数a的二进制从右端开始的4--7位。

提示:

先使a右移4位。即:a>>(7–4+1)

a>>4

设置一个低4位全为1,其余全为0的数b。即:

~(~0<<4)

将两者进行&运算

程序如下:#inc

温馨提示

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

最新文档

评论

0/150

提交评论