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

下载本文档

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

文档简介

1、第10章 位 运 算 位运算是指对二进制位进行的运算。每个二进制位中位运算是指对二进制位进行的运算。每个二进制位中只能存放只能存放0或或1。因此,位运算就是对二进制数的运算。通。因此,位运算就是对二进制数的运算。通常,将一个数据用二进制数表示后,最右边的二进制位称常,将一个数据用二进制数表示后,最右边的二进制位称为最低位(第为最低位(第0位),最左边的二进制位为最高位。位),最左边的二进制位为最高位。 图10.1 微机中整数的二进制位表示15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 10.1 二进制位运算二进制位运算10.2 位位 段段10.3 程序举例程序举例1

2、0.1 二进制位运算二进制位运算 在在C语言中共提供了语言中共提供了6种位运算符,如表种位运算符,如表10.1所示。所示。表表110.11位运算符意 义&|按位与按位或按位异或按位取反左移右移 (1)在这)在这6种位运算符中,其中按位取反是单目运算符,种位运算符中,其中按位取反是单目运算符,只有一个运算对象,其他均为双目运算符,有两个运算对象。只有一个运算对象,其他均为双目运算符,有两个运算对象。(2)位运算的运算对象只能是整型(包括)位运算的运算对象只能是整型(包括int,short,long和和unsigned)或字符型数据,而不能是实型数据。)或字符型数据,而不能是实型数据。(3

3、)各位运算符的优先级比较分散,与其他运算符一起,)各位运算符的优先级比较分散,与其他运算符一起,其优先级从高到低如下:其优先级从高到低如下: 逻辑非逻辑非(!)按位取反按位取反()算术运算符算术运算符左移运算符左移运算符()关系运算符关系运算符按位与运算符按位与运算符(&),按位异,按位异或运算符或运算符(),按位或运算符,按位或运算符(|)&与与| 赋值运算符赋值运算符1“按位与按位与”运算符运算符(&) “ “按位与按位与”的运算符为的运算符为“&”。其运算规则是:若两个运。其运算规则是:若两个运算对象的对应二进制位均是算对象的对应二进制位均是1,则结果的对

4、应位是,则结果的对应位是1,否则为,否则为0。 利用利用“按位与按位与”运算可以实现以下功能:运算可以实现以下功能:(1)取出数据中指定的位)取出数据中指定的位(2)将数据中的指定位清零)将数据中的指定位清零2“按位或按位或”运算符(运算符(|) “ “按位或按位或”的运算符为的运算符为“|”。其运算。其运算规则是:若两个运算对象的对应二进制位规则是:若两个运算对象的对应二进制位中有一个是中有一个是1,则结果的对应位是,则结果的对应位是1,否则,否则为为0。 例例10.2 下列下列C程序的功能是将整型数组中所有元素转换程序的功能是将整型数组中所有元素转换为不小于它的最小奇数,并显示输出。为不小

5、于它的最小奇数,并显示输出。#include stdio.hmain() int k,a1023,14,24,31,46,55,33,68,27,40; for (k0;k10;k) printf(%5d,ak); printf(n); for (k0;k10;k) akak|0 x01; for (k0;k10;k) printf(%5d,ak); printf(n);3“按位异或按位异或”运算符运算符() “ “按位异或按位异或”的运算符为的运算符为“” 。其运算规则是:若两。其运算规则是:若两个运算对象的对应二进制位不相等,则结果的对应位是个运算对象的对应二进制位不相等,则结果的对应位是

6、1,否则为否则为0。 “按位异或按位异或”运算具有以下几个性质:运算具有以下几个性质: (1)使数据中的某些位取反,即将)使数据中的某些位取反,即将0变为变为1,1变为变为0。 (2)同一个数据进行异或运算后,其结果为)同一个数据进行异或运算后,其结果为0。利用异或。利用异或运算的这个性质,可以将变量清零。运算的这个性质,可以将变量清零。 (3)可以实现交换两个变量的值:)可以实现交换两个变量的值:4“按位取反按位取反”运算符运算符() “ “按位取反按位取反”的运算符为的运算符为“”。其运算规则是:将。其运算规则是:将运算对象中的各二进制位值取反,即将运算对象中的各二进制位值取反,即将0变为

7、变为1,1变为变为0。5 5“左移左移”运算符运算符()() “左移左移”运算符为运算符为“) “右移右移”运算符为运算符为“”。其运算规则是:将运算对象中。其运算规则是:将运算对象中的每个二进制位向右移动若干位,从右边移出去的低位部分的每个二进制位向右移动若干位,从右边移出去的低位部分被丢弃。但左边空出的高位部分是补被丢弃。但左边空出的高位部分是补0还是补还是补1,要视下列具,要视下列具体情况而定:体情况而定: 若右移对象为无符号整型数,则右移后左边空出的高位若右移对象为无符号整型数,则右移后左边空出的高位部分补部分补0。 若右移对象为一般整型数或字符型数据,当该数据的最若右移对象为一般整型

8、数或字符型数据,当该数据的最高位为高位为0(对于一般整型来说即为正数),则右移后左边空(对于一般整型来说即为正数),则右移后左边空出的高位部分补出的高位部分补0。当该数据的最高位为。当该数据的最高位为1(对于一般整型来(对于一般整型来说即为正数),则与使用的计算机系统有关,有的计算机系说即为正数),则与使用的计算机系统有关,有的计算机系统将右移后左边空出的高位部分补统将右移后左边空出的高位部分补1,称为,称为“算术右移算术右移”;有的计算机系统将右移后左边空出的高位部分补有的计算机系统将右移后左边空出的高位部分补0,称为,称为“逻辑右移逻辑右移”。 10.2 位位 段段 在在C语言中,定义位段

9、结构类型的一般形式为语言中,定义位段结构类型的一般形式为 struct 位段结构类型名位段结构类型名 成员表成员表 ;在定义位段与使用位段时,要注意以下几个问题:在定义位段与使用位段时,要注意以下几个问题:(1)位段成员的类型必须是)位段成员的类型必须是unsigned型。型。(2)在位段结构类型中,可以定义无名位段,这种无)在位段结构类型中,可以定义无名位段,这种无名位段具有位段之间的分隔作用。名位段具有位段之间的分隔作用。 (3)每个位段(成员)所占的二进制位数一般不能超)每个位段(成员)所占的二进制位数一般不能超过一个字长(即一个存储单元)。过一个字长(即一个存储单元)。 (4)在位段结

10、构类型定义中,可以包含非位段成员。)在位段结构类型定义中,可以包含非位段成员。 (5)位段可以在一般的表达式中被引用,并被自动转)位段可以在一般的表达式中被引用,并被自动转换为相应的整数。换为相应的整数。 10.3 程序举例程序举例 例例10.3 编写一个编写一个C程序,其功能是:从键盘输入一个程序,其功能是:从键盘输入一个无符号整数无符号整数m以及位移位数以及位移位数n,当,当n0时,将时,将m循环右循环右移移n位;当位;当n0时,将时,将m循环左移循环左移|n|位。位。 将一个无符号整数将一个无符号整数m循环移循环移n位的方法如下:位的方法如下: 首先用首先用sizeof函数确定一个无符号

11、整数所占的二进制位数函数确定一个无符号整数所占的二进制位数k。 如果是循环右移,则先将如果是循环右移,则先将m右移右移n位(即将原数的高位(即将原数的高kn位移到低位),再将位移到低位),再将m左移左移kn位(即将原数的低位(即将原数的低n位移到位移到高位),然后将它们作按位或运算(即将它们合并)。高位),然后将它们作按位或运算(即将它们合并)。 如果是循环左移,则先将如果是循环左移,则先将m左移左移n位(即将原数的低位(即将原数的低kn位移到高位),再将位移到高位),再将m右移右移kn位(即将原数的高位(即将原数的高n位移到位移到低位),然后将它们作按位或运算(即将它们合并)。低位),然后将它们作按位或运算(即将它们合并)。 其其C程序如下:程序如下:#include stdio.h main() unsigned m; int n; printf(input m:); scanf(%x,&m); printf(input n:); scanf(%d,&n); if (n0) printf(moveright%xn,moveright(m,n); else printf(moveleft%xn,moveleft(

温馨提示

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

评论

0/150

提交评论