c语言高16位与低16位互换,新编C语言程序设计教程PPT第12章 位运算

《新编C语言程序设计教程PPT第12章 位运算》由会员分享,可在线阅读,更多相关《新编C语言程序设计教程PPT第12章 位运算(21页珍藏版)》请在人人文库网上搜索。

1、新编C语言程序设计教程 清华大学出版社,周二强 软件学院 计算机科学与工程系 配套视频: 博客:,第12章 位运算,12.1 位操作符 12.1.1 按位与操作符& 12.1.2 按位或操作符 12.1.3 异或操作符 12.1.4 取反操作符 12.1.5 左移操作符 12.2 位运算示例 12.3 位段,位运算,位运算是指按二进制位进行的运算,实际上就是直接对整数在内存中的二进制位进行操作。 考虑这样的问题:编程控制编号为0至7的八盏灯的开关。 可以定义一个长度为8的短整型数组变量a。 可以定义一个无符号的字符型变量c。 如果c的值为128(1000 0000),则7号灯亮,其余灯灭;为1。

2、92时(1100 0000),则6号和7号灯亮,其余的灭。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。,位操作符,C语言提供的位操作符有按位与&、按位或、按位异或、取反、左移。 位操作符的操作数仅限整型(字符型), 为简明下面示例中位操作符的操作数多为字符型。,return,12.1.1 按位与操作符&,按位与操作符&将参与运算的两个操作数,按二位进制位进行“与”运算。与运算时,如果两个二进制位上的数均为1 ,则运算结果的相应位为1,否则运算结果的相应位为0。即 1 & 1 = 1、1 & 0 = 0、0 & 1 = 0、0 & 0 = 0 例如:char a = -2, b = 3。

3、,则a & b的值为2。,按位与操作符&,从按位与操作符&的运算规则可知,利用按位与操作符&可以很容易地在不影响其它位的情况下将一个整数的某位设置为0。 例如,无符号字符型c的值为165(1010 0101),即现在是第0、2、5、7号灯亮。需熄灭第七号灯时, 只要让c与0 x7f(0111 1111)进行按位与运算即可。,注意:,1. 按位与操作符也可以构成复合赋值操作符,即c = c & 0 x7f可改写为c &= 0 x7f。 2. 利用按位与操作符对整型变量a的各位进行取舍时,如果保留某位的值,则另一操作数的对应位值为1;如果清零,则对应位的值为0。 1 & 1 = 1、1 & 0 =。

4、 0、0 & 1 = 0、0 & 0 = 0,return,12.1.2 按位或操作符,按位或操作符将参与运算的两个操作数,按二进制位进行“或”运算。或运算时,如果两个二进制位上的数都为0,则运算结果的对应位为0;否则,对应位为1。即 1 | 1 = 1、1 | 0 = 1、0 | 1 = 1、0 | 0 = 0。 由运算规则可知,利用按位或操作符可以很容易地在不影响其它位的情况下将一个整数的某位设置为1。 例如,无符号字符型c的值为165,需点亮1号灯时,只要让c与0 x2作按位或运算即可。c |= 0 x2,return,12.1.3 异或操作符,异或操作符也称xor操作符。“异或”指参与。

5、运算的两个二进制位是否为异(不同),不同时结果为1(真),相同时结果为0(假)。即 1 1 = 0、1 0 = 1、0 1 = 1、0 0 = 0。 分析运算规则可知,某位与1进行异或运算时,结果与该位正好相反(翻转),即1变0,0变1;某位与0进行异或时,结果与该位相同。 例如,无符号字符型c的值为165,需把第0到3号灯的状态进行翻转时即亮的灭,灭的亮,只要让c与0 xf作异或操作即可。c = 0 xf,return,12.1.4 取反操作符,取反操作符是一个单目操作符,用来对一个整数按二进制位取反,即0变1,1变0。 例如,无符号字符型c的值为165,需把所有灯的状态进行翻转时,只要让进。

6、行取反操作即可。c = c。 整数a的相反数可以表示为a + 1。 因为a等价于-1-a,故a+1的值为-1-a+1为-a。,return,12.1.5 左移操作符,左移操作符常用形式为:a n 其中,a和n均为整数,表达式求值时将a的二进制位全部左移n位,右端补n个0,左端移出的n位因溢出而舍弃。显然n的取值范围通常为1至sizeof(a)。 左移1位的值为a的2倍,左移2位的值为a的4倍,(表达式的值不能超出整型的取值范围)。左移操作要比相应的乘法运算(a*2)快得多。 在位运算中,左移运算常用于构造操作数。,构造操作数,无符号字符型变量c的值为165,需点亮第6号灯,可以用如下表达式 c。

7、 |= 1 6,其中,1 6即0100 0000。 注意: 左移操作也可看作算术运算,故其优先级低于算术操作符但高于关系运算符。 单目操作符的优先级较高。按位与、按位或和按位异或的优先级低于关系操作符,但高于逻辑操作符。,return,12.1.6 右移操作符,右移操作符与左移操作符类似,表达式a n求值时,会将a的二进制位全部右移n位,右端移出的n位因溢出而被舍弃。 根据左端移入数的不同,右移操作分为“逻辑右移”和“算术右移”两种。 逻辑右移时,无论a为何类型,左端均移入n个0;算术右移时,如果a为无符号数,则左端移入n个0;如果a为有符号数,则左端移入的数为a的符号位,即a为正数时移入0,。

8、a为负数时移入1。TC和VC6.0中均采用算术右移。,例12-1 分析下面求整数绝对值的函数,分析: 如果x=0,则y的值为0,(x y) - y 的结果仍为x。 如果x0,则y的值为-1,x与y进行异或运算实际上为对x进行取反操作,减y就是加1。x取反加1的结果就是x的相反数,即-x。,return,12.2 位运算示例,例12-2 用无符号字符型的一位控制编号为07的八盏灯中的一盏,为1时相应的灯亮,否则灯灭。随机生成20个07的整数,根据整数调整相关编号灯的开关。如整数为5,则5号灯亮时关掉它,灭时打开它。最初时八盏灯均不亮,编程输出最终灯的状态。,例12-2,例12-3把一个整数32位。

9、中的高16位和低16位互换。,return,12.3 位段,通过位运算能够以位为单位使用内存空间,如可以设置、改变或读取一个或多个二进制位的值,但是这些操作不但麻烦而且极易出错。C语言提供了“位段”,利用位段,可以方便的实现类似操作。 C语言允许在一个结构体中以位为单位指定其成员实际存储空间的长度,结构体中指定存储长度的成员就是所谓的位段。,结构体中的结构体,结构体struct bitfield虽然有三个整型成员a,b,c,但它们存储空间的长度只有2位、4位和2位。 特别强调,整型成员a、b、c虽然位数不多,但仍为有符号数,即a、c的取值范围为-2至1,b的取值范围为-8至7。,位段,位段仅仅是自定义了存储空间的长度,使用时与正常的结构体成员相同,如bf.a = 1,bf.b = -8等。 当参与运算时,位段会自动转换成整型,当给位段赋一个超出其取值范围的值时,左端多余的位数会被舍弃。 位段类型转换和赋值的原则与C语言基本类型所遵循的原则相同,如printf(%d,%dn, bf.a + bf.b, bf.c = 15)的输出为-7,-1。,关于位段,需注意:,1. 位段的类型只能为整型(有符号,无符号及字符型)。 2. 位段的自定义长度不能大于其默认的长度。 3. 位段的具体实现通常与编译系统相关。,return。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值