C语言程序设计丁峻岭,C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第十一章...

1、第11章 位运算,11.1 位运算与位运算符 11.2 位运算应用举例 11.3 位段 课后练习,我们知道,计算机真正执行的是由0和1信号组成的机器指令,数据也是以二进制表示的。因此最终要实现计算机的操作,就是要对这些0和1信号进行操作。每一个0和1的状态称为一个“位”(bit)的状态。C语言中这种对字节和位的操作就称为位操作或位运算。 对整型或字符型数据来说,C语言具有直接操作其字节或位的能力。C语言同汇编语言相比,虽然位操作运算没有后者那么丰富,但它可以实现大部分常用的位运算,比如按位取反、数据的左移或右移,等等,这对程序的编制还是相当灵活和方便的。,11.1 位运算与位运算符 C语言所提。

2、供的位操作运算符如表11-1所示。,说明: 位运算中除“”以外,均为二目运算符,即要求两侧各有一个运算量。 运算量只能是整型或字符型数据,不能为实型数据。,这些位运算符可以与赋值运算符相结合,成为位运算赋值操作。如表11-2所示。,11.1.1 按位与运算符 运算符“&”要求有两个运算量(如a&b),作用是将a和b中各个位分别对应进行与运算,即二者都为1时结果为1,否则为0。按规则具体有: 0&0=0 0&1=0 1&0=0 1&1=1 【例11.1】对于两个char类型的八进制数(255和313)进行按位“与”运算后,则运算情况为:,a= 1 0 1 0 1 1 0 1 (八进制255) &。

3、 b= 1 1 0 0 1 0 1 1 (八进制313) 结果= 1 0 0 0 1 0 0 1 (八进制211),程序如下: main() unsigned char x=0255,y=0311; printf(“x 运行情况如下: x&y=211,【例11.2】测试输入数据的第3位是否为1(位号是从右向左数,起始位为第0位)。如果为1则输出8,否则输出0。 程序如下: main() unsigned short x=8,y; scanf(“%hd”, 下面是几次运行情况: 8(回车) 24(回车) 40(回车) 8 8 8 程序的设计思路是,将一个十进制数8与y进行& 运算,如果结果为8,。

4、则第3位必然为1,否则结果是0。 在进行位运算时,用十进制数表示很难直接看出每一个二进位的状态。有鉴于此,人们在进行位运算时常常用八进制数或十六进制数。,【例11.3】编写程序测试输入数据的任何一位是否为1。 由上例改写后的程序如下: main() unsigned short x,y; scanf(“%hx“, 运行情况如下: (如果要测数据的第4位是否为1) (如果要测数据的第5位是否为1) 10(回车) 20(回车) 12(回车) 23(回车) 10 20,x和y都是从键盘输入的十六进制数,其中x是用来测试y的某一位是否为1的数。第一个输入值为十六进数10,即二进制00010000,目的。

5、是测试第二个输入数据y的第4位是否为1,由于y的值为十六进制12,即二进数00010010,所以x&y的值为十六进数10,与x相同,则说明y的第4位为1。第二次运行的值为二进制数00100000,目的是测第5位是否为1,输入的数相当二进制数001000011,第5位为1,x&y结果为十六进数20,与x相同,则说明y的第5位为1。 由上可知,如果x&y的运算结果与x相同,则说明x中为1的位,y中相应的位也为1。上面我们用的只有1位为1,实际上可以推广到测试若干位是否为1。例如,测试y的低4位是否为1,此时可以使x的值为十六进制的0f,如果x&y的结果为0f,则说明y的低4位为1。,用这个方法不仅。

6、可以测试一个数的某几位是否为1,还可以用来取一个数中的某几位。例如,取数据y的低4位,用0xf&y运算即可;取该数据的低5位,则用0x1f&y即可。例如,y为十六进制的25,其&运算为:,x= 1 0 1 0 1 1 0 1 & y= 1 1 0 0 1 0 1 1 x&y = 1 0 0 0 1 0 0 1,可见x&y运算结果的低5位与y的低5位完全相同。 利用这种方法甚至可以测试一个数中奇数位或偶数位是否为 1,或取一个数中的奇数位或偶数位的状态等。这种取一个数中某几位的办法称为“屏蔽方法”,即用0屏蔽掉一个数某些位,保留其余的位。例如,上面的0x1f称为“屏蔽字”,用来屏蔽掉y的高3位而。

7、保留低5位。,11.1.2 按位或运算符 按位或运算要求有两个运算量,这两个运算量之中,只要有一个为1 则运算结果为1,否则为0。具体有: 00=0 01=1 10=1 11=1 【例11.4】对两个十六进数10与34进行“或”运算,则运算情况为:,x=0 0 0 1 0 0 0 0 (16进制10) () y=0 0 1 1 0 1 0 0 (16进制34) xy=0 0 1 1 0 1 0 0 (16进制34),程序如下: main() unsigned short x,y; printf (“输入两个十六进制数:“); scanf(“%hx“, 运行情况如下: 输入两个十六进制数:10 。

8、34(回车) 输入两个十六进制数:07 d0(回车) 34 d7,组合二个变量中某些位成为一个新值的方法是:将不被包含到新值去的那些位置为0,然后进行或运算即可。上例中的x的高4位和y的低4位是不需要的,不被包含到新值中去的,故置0。这种方法不仅能保留两个变量中的各4位,而且可以是任意若干位。,可以用“|”运算符将不同字节中的某些位组合成为新的值。例如:,x=0 0 0 0 0 1 1 1 (16进制07) () y=1 1 0 1 0 0 0 0 (16进制d0) xy=1 1 0 1 0 1 1 1 (16进制d7),11.1.3 按位异或运算符 按位异或运算的作用是,判断两个数据对应位上。

9、的值是否“相异”(不同),若相异,则结果为1,否则为0。具体有: 00=0 01=1 10=1 11=0 异或运算符可用于“翻转”某位的值,也就是使0翻转为1,使1翻转为0。这是因为1与1进行异或运算结果为0,而10又成为1。如果想翻转一个变量的某一位,就使该变量与一个该位为1其余位全置0的数进行异或运算。例如,若想使b的第4位翻转,就应使a的第4位为1其余各位为0,ab的运算结果中第4位改变了(起始位为第0位),而其余各位不变。,列式计算如下:,a=0 0 0 1 0 0 0 0 (16进制10) () b=0 0 1 1 0 1 0 1 (16进制35) ab=0 0 1 0 0 1 0 。

10、1 (16进制25) 此位翻转,【例11.5】输出两个十六进数的“异或”结果。 main() unsigned short x,y; printf (“输入两个十六进制数:”); scanf(“%hx”, 运行情况如下: 输入两个十六进制数:10 35(回车) 25 输入两个十六进制数:11 35(回车)24 利用异或运算不仅可以翻转数据的某一个位,而且可以实现若干位的“翻转”。 如果使y二次与x进行异或运算,则其值仍为原值,即yxy=y。,11.1.4 按位取反运算符 “”是一个单目运算符,运算量写在运算符之后。取反运算符的作用是使一个数据中所有位都取其反值(即0变1,1变0)。例如: a=。

11、 0 0 0 0 0 0 1 1 (16进数03) a= 1 1 1 1 1 1 0 0 (16进数fc),【例11.6】输出一个十六进数按位取反的结果。 main() unsigned char x; printf (“输入一个十六进制数:”); scanf(“%hx”, 运行情况如下: 输入一个十六进制数:03(回车) fc 输入一个十六进制数:fc(回车) 03 也可把变量x定义为整型变量,则可以对16个二进位进行取反运算。,11.1.5 左移运算符 左移运算符是“”,左移的含义是,将一个数据中的各个位全部左移若干位。 【例11.7】“x2”表示将x中各位左移2位,如果x的值为十六进数8。

12、5,左移2位后得14,左移后移出的两位丢失,右边空出来的位置补零。运算情况如下:,程序实现如下: main() unsigned char x,y; printf (“输入一个十六进制数:“); scanf(“%hx“, 运行情况如下: 输入一个十六进制数:85(回车) 14,可用左移运算实现乘法运算。在对机器操作的过程中,一个数据左移1位相当于该数据乘2,左移2位相当于乘4。由于左移运算比乘法运算要快得多,有些C编译系统会自动将乘2的操作通过左移1次来实现,将乘2n的幂运算用左移n位来实现。比如,一个二进制数15左移2位的值为60。 但有一点要注意,以上结论只是在左移不出现溢出才是正确的。这。

13、是容易想象的,比如a8,假如a为char类型,等于15,因为该数共占内中的一个8位字节,左移8位,左面高位溢出,右面补零,结果为0。,11.1.6 右移运算符 与左移相反,右移运算符“”的作用是,使一个数的各个位全部右移若干位,右移出去的位丢失,左端补入的数值将视情况而定。这点与左移是不太相同的,要区分不同情况。 (1)对无符号int型或char型数据来说,右移时左端补零。这种移位方法称为“逻辑右移”。例如:,【例11.8】输出一个16位无符号数右移两位后的运算结果。 main() unsigned short x,y; printf (“输入一个十六进制数:”); scanf(“%hx”, 。

14、运行情况如下: 输入一个十六进制数:85(回车) 33,21 输入一个十六进制数:60(回车)24,18 输入一个十六进制数:85(回车) 16350,3fde 输入一个十六进制数:60(回车)16360,3fe8,有符号数60以补码表示为11111111 10100000,逻辑右移2位后为00111111 111101000,也就是十六进制数3fe8,运算情况如下:,(2)对带符号的int和char类型数据右移,如果符号位为0(即正数),则左边也是补入0,如果符号位为1(即负数),则左边补入的全是1,这是为了保存该数原来的符号并实现右移一位相当于除2。这种补入符号位以保持符号不变的方法称为“。

15、算术右移”。,【例11.9】输出一个16位有符号数右移两位后的运算结果。 main() signed short x,y; printf (“输入一个十六进制数:”); scanf(“%hx”, 运行情况如下: 输入一个十六进制数:85(回车) 33,21 输入一个十六进制数:60(回车)24,18 输入一个十六进制数:85(回车) 34,ffde 输入一个十六进制数:60(回车)24,ffe8,有符号数60以补码表示为11111111 10100000,算术右移2位后为11111111 111110000,也就是十进制数24,运算情况如下:,return,11.2 位运算应用举例 在C语言程序的编制过程中,人们有时希望知道某个数的二进制数表示形式。但C语言中的printf函数只提供了“%x”、“。

《C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第十一章》由会员E****分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第十一章》请在金锄头文库上搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值