版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1111章章 位运算位运算11.1 位运算符11.2 位段11.3应用举例11.1 位运算符当两个运算对象的位数不同时,系统将自动进行如下处理:v先将两个运算数右端对齐。v 再将位数不足的一个运算对象向高位扩充,即:无符号数和正整数左端用0补齐;负数左端用1补齐;然后对位数相等的这两个数按位进行运算。q“按位与按位与”运算(运算(&)v“按位与”运算是将参加运算的两操作对象,按对应的二进制位分别进行“逻辑与”运算。v运算规则为:只有两个相应位都为1时, 该位的运算结果才为1;两个相应位的值相异或均为0时,该位的运算结果为0。11.1 位运算符【例11.1】求表达式12&10的值。main(
2、 )char x=12,y=10; printf(“%d,%dn”,x,y); x=x&y; printf(“%d,%dn”,x,y); 输出结果为:12,108,1011.1 位运算符v按位与运算用途:清零:若想将某个存储单元清零,只需将这个存储单元的值与零进行“与”运算 。【例11.2】分析下面程序结果main( ) char ch=46; printf(%d n,ch); ch=ch&0; printf(%d n,ch); 输出结果为:46 011.1 位运算符获取指定位: 如果要想获取某数据X的指定位,则可以用一个数与X进行“与”运算,此数在与指定位相同的位上的值为1,其余各位为0。【
3、例11.3】从键盘输入一个整数,判断此数是否能被2整除 。#includemain( ) int x; printf(Please input a number: ); scanf(%d,&x); if(x&0 x01)=0) /*通过与运算,只保留该数的最低位,然后判断其是否为0*/ printf(n%d can be divided by 2 exactly! ,x); /*最低位为0,该数能被2整除*/ else printf(n%d cant be divided by 2 exactly! ,x); /*最低位为1, 不能被2整除*/11.1 位运算符q“按位或按位或”运算(运算(|
4、)v按位或运算是将参加运算的两操作对象,按对应的二进制位分别进行“逻辑或”运算。v运算规则为:只有两个相应位都为0时, 该位的运算结果才为0,其它情况下,结果全为1。【例11.4】求表达式12|10的值。main( )char x=12,y=10; printf(“%d,%dn”,x,y); x=x|y; printf(“%d,%dn”,x,y);输出结果为:12,1014,1011.1 位运算符v用途:按位“或”经常用来对一个数据的某些位置1。【例11.5】把整数x(8位)的低4位置1,高4位不变。main( ) char x=67; printf(“%dn”,x); x=x|15; pri
5、ntf(“%dn”,x);输出结果为:677911.1 位运算符q“按位异或按位异或”运算(运算()v按位或运算是将参加运算的两操作对象,按对应的二进制位分别进行“按位异或”运算。v运算规则为“按位异或”的应用:参加运算的两个运算量,如果两个相对应位上的值不同 ,则该位的结果为1;如果对应位上的值相同,则该位的结果为0。v“按位异或”的应用 使特定位翻转,即使指定的位求反。【例11.6】设x=46,将其高4位保留原样,低4位各位求反。main( ) char x=46; printf(“%dn”,x); x=x15; printf(“%dn”,x);11.1 位运算符输出结果为:4633对变量
6、置零。每一个数与它自身进行“异或”运算,结果各位均为零。即:xx=0。 【例11.7】不用临时变量,交换两个变量的值。main( )char x=12,y=10; printf(“%d,%dn”,x,y); x=xy;y=yx;x=xy ; printf(“%d,%dn”,x,y);输出结果为:12,1010,1211.1 位运算符q“按位取反按位取反”运算(运算() “按位取反”运算符“”是唯一的一个单目位运算符,用来将一个二进制数按位取反,即将1变0,将0变1。【例11.8】给出一个数的原码,求出该数的补码。 main( ) unsigned int a; /*声明一个无符号的整数a*/
7、unsigned int getbits(unsigned);/*函数声明*/ printf(nInput an octal number: ); scanf(%o,&a); /*以八进制形式输入一个无符号的整数*/ printf(result:%o ,getbits(a); /*以八进制形式输出*/ 11.1 位运算符unsigned int getbits(unsigned value) /*求一个二进制数的补码*/ unsigned int z; z=value&10000000; if(z=10000000) z=value+1; /*对负数求其补码*/ else z=value; /
8、*正数不变*/ return(z); 运行情况如下:Input an octal number:2345result:2345再次运行:Input an octal number:1252525result:525311.1 位运算符q“左移左移”运算(运算()v左移运算符“”是双目运算符,左移运算的一般形式为: 运算对象运算对象左移位数左移位数v作用:将一个数的各二进制位依次左移若干位(由左移位数给出),左移时,右端(低位)补0,左端(高位)移出的部分舍去。 【例11.9】输入两个1位十进制数字符a和b,由a、b组合生成整数c(c用字符类型表示),并显示出来。生成规则是:a的低4位作为c的高
9、4位,b的低4位作为c的低4位。 屏蔽掉a,b的高4位; a左移4位,使a的低4位成为高4位; 将a和b拼在一起,形成c。11.1 位运算符main( )char a,b,c; while(1) /*输入a,b*/ printf(Please input a and b:n); scanf(%c %c ,&a,&b); if (a=0)&(b=0) break; a=a)v右移运算符“”是双目运算符,右移运算的一般形式为: 运算对象运算对象右移位数右移位数v作用:将一个数的各二进制位依次右移若干位(由右移位数给出),右移时,右端(低位)移出的部分舍去,左端(高位)移入的二进制数分两种情况:对于
10、无符号数和正整数,高位补0;对于负整数,高位补1。例如:int a=5,b=-3,x,y;x=a2;y=b2;11.1 位运算符q位复合赋值运算符位复合赋值运算符q注意注意v位运算的类型可以是整型(int、unsigned或long int)或字符型(char)数据。v当两个运算对象的类型不同时系统会自动进行如下处理:两个运算对象按位右对齐;较短的运算对象高位符号扩展;即如果是正数,高位补0,如果是负数,高位补1。复合运算符 名称 表达式 等价的表达式 &= 按位与赋值 a&=b a=a&b |= 按位或赋值 a|=b a=a|b = 按位异或赋值 a=b a=ab = 右移位赋值 a=b a
11、=ab = 左移位赋值 a=b a=a4 设置一个低4位全为1,其余为0 的数 (0 4; /*将a右移4位后赋值给变量b*/ c = (0 4); /*使低4位全为1,其余为0 */ d = b & c; printf(“%on%on”,a,d); 11.3应用举例【例11.11】从键盘上输入一个十进制整数,统计该整数所对应的二进制数中1的个数。分析:统计一个整数m中1的个数有两种方法。方法1:循环执行、 测试m的第0位是否为1,是则1的个数加1; m右移1位;程序如下:main( ) int i,count,m; printf(Please input m:); scanf(%d,&m);
12、 count=0;11.3应用举例 for(i=0;i1; printf(Numbers of 1 in m=%d,count);方法2: k=1; 循环执行、 测试m的第k位是否为1,是则1的个数加1; k左移1位。11.3应用举例程序如下:main( ) int i,count,m,k; printf(Please input m:); scanf(%d,&m); count=0; k=1; for(i=0;i=16;i+) if(m&k)!=0) count+; k=k0111101111110101(注意,不能直接使用运算符,因为,运算符使左面添0或添1。)方法如下: 将a的右端n位先
13、放到中间变量b的高n位中。 (左移16-n位)b= an; 将c与b 进行按位或运算。 c=a | b11.3应用举例程序如下:main( )unsigned a,b,c; int n; scanf(a=%o,n=%d,&a,&n); /*a以八进制形式输入,右移位数以十进制形式输入*/ b=an; c=c|b; printf(%on%o,a,c); /*以八进制形式输出*/ 11.3应用举例【例11.13】编写函数leftloop,实现将16位数循环左移n位。循环左移可以用下述方法实现:将源操作数送入一中间变量;将中间变量右移16-n位,使高端n位移至低端;将源操作数左移n位;用“按位或”运算将中间变量和源操作数合并在一起。11.3应用举例leftloop(unsigned *value,int n) /* value是源操作数,n是移位位数*/unsigned a,b; a=*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026九年级下语文溜索环境描写赏析
- 2026数学 数学学习灵活性培养
- 2026道德与法治七年级探究与分享 小群体与集体
- 2026七年级道德与法治下册 集体氛围温馨化
- 2026九年级上语文怀疑与学问第一课时导入
- 2026年中小学教师编制考试历史学科专业知识考试试卷及答案(共十六套)
- 宁夏广播电视传输发射基地迁建项目1#发射塔钢结构安装施工专项方案
- 2026栗子养生知识课件
- 角平分线第1课时角平分线的性质及判定课件2025-2026学年北师大版八年级数学下册
- 产品研发流程标准化模板需求分析至测试验收版
- 兰州市2026事业单位联考-综合应用能力E医疗卫生模拟卷(含答案)
- 2026年工会知识竞赛押题宝典模考模拟试题【考点提分】附答案详解
- 24J113-1 内隔墙-轻质条板(一)
- DB11∕T 1444-2025 城市轨道交通隧道工程注浆技术规程
- 导管相关血流感染预防与控制指南
- 射频连接器与电缆组件
- GB/T 29863-2023服装制图
- 工程材料及成形技术基础塑性加工
- GB/T 2831-1981光学零件的面形偏差检验方法(光圈识别)
- GB/T 21709.9-2008针灸技术操作规范第9部分:穴位贴敷
- GB/T 20303.1-2016起重机司机室和控制站第1部分:总则
评论
0/150
提交评论