版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机的C语言中位操作用法作者:郭天祥来源:转自更新时问:2008-12-4 21:50:22浏览次数:3123在对单处机进行编程的过程中,对位的操作是经常遇到的。C51对位的操控能力是非常强大的。从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言匙近硬件的特点。这也是在各个领域中都可以看到C的重要原因。在这一节中将详细讲解C51中的位操作及其应用。1、位运算符C51提供了几种位操作符,如下表所示:运算符含义运算符含义&按位与取反按位或«左移按位异或»右移1) “按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。原则是全1为1,有
2、0为0,即:0&0 二 0; 0&1二0; 1&0 二 0; 1&1二1;如下例:8二5&3;/a= (Ob 0101) & (Ob 0011)二Ob 0001 二1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式 表示的二进制数来进行与运算。沪-5&-3; a二(Ob 1011) & (ObilOl)二0b 1001 二-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。如下例:a二Oxfe; /a=0b 11111110a=a&0x55;/使变量a的第1位、第
3、3位、第5位、第7位清零屮0b010101002. 检测位要知道一个变量中某一位是T'还是'0',可以使用与操作来实现。a-0xf5: /a=Ob 11110101resuIt二a&0x08;检测 a 的第三位,result二03保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。沪0x55; /a=Ob 01010101a-a&OxOf; 将高四位清零,而保留低四位a二0x052) “按位或”运算符(I )参与或操作的两个位,只要有一个为1,则结果为。即有'1'为1',全'0'为,O&
4、#39; o0|0二0; 0|1二1; 1|0二1; 111=1;例如:a=0x30|OxOf;/a二(0b00110000)(0b00001111) = (0b00111111)=0x3f按位或”运算最普遍的应用就是对一个变量的某些位置T'。如下例:a二0x00;/a=0b 00000000沪&|0x7f;将 a的低7位置为l,a=0x7f3) “异或”运算符(八)异或运算符八又被称为XOR运算符。当参与运算的两个位相同(T'与1'或'0'与'0')时结果为'0'。不同时为'1'。即相同为0,不同
5、为lo0*0二0; o_i=i; 1*0=1; rl=0;例如:a=0x55 0x3f;/a二(0b01010101厂(ObOOllllll)二(ObOllOlOlO)二0x6a异或运算主要有以下几种应用:1.翻转某一位当一个位与1'作异或运算时结果就为此位翻转后的值。如下例:a二*0x0f;/a=0b00111010 a 的低四位翻转关于异或的这一作用,有一个典型的应丿IJ,即取浮点的相 反数,具体的实现如下:f二1. 23;/f为浮点型变量值为123f二f*-1; f乘以-1,实现取其相反数,要进行一次乘运算f 二1.23;(unsigned char *)&f) 0二0x
6、80; 将浮点数 f 的符号 位进行翻转实现取相 反数2 保留原值当一个位耳,0,作异或运算时,结果就为此位的值。如下例:a=0xff; /&二Obi1111111a二*0x0f;/a-0bl 1110000 与 OxOf 作异或,高四位不变,低四位稀转3. 交换两个变量的值,而不用临时变量如下:要交换两个变量的值,传统的方法都需要一个临时变量。实现void swap(unsigned char *pa,unsigned char *pb)unsigned char temp=*pa; /定义临时变量,将pa指向的 变量值赋给它pa=*pb;pb二temp;f,变量值对调而使用异或的方
7、法来实现,就可以不用临时变量,如下:void swap xor(unsigned char *pa, unsigned char *pb)pa=*pa>pb; /检查不同位,并置位1相同为置位0 置 位1的位表示不同需要交换,置位0的位相同保留 pb=*pa>pb; /反转不同位pa=*pa>pb;采用异或实现变量对调I从上例中可以看到异或运算在开发中是非常实用和神奇的。4)取反”运算符()与其它运算符不同,“取反”运算符为单目运算符,即 它的操作数只有一个。它的功能就是对操作数按位取反。也就 是是T'得'0',是'0'得'1&
8、#39; o1二0; 0二1;如下例:a=0xff; /aObllllllllQ. a; / / aObOOOOOOOO1.对小于0的有符号整型变量取相反数d 二T;d为有符号整型变量,赋值为-1,存表示为Ob 11111111 11111111dd+l; 取d的相反数,d=l,存表示Ob 0000000000000001此例运用了负整型数在存以补码方式来存储的这一原理来实现的。负数的 补码方式是这样的:负数的绝对值的存表示取反加1,就 为此 负数的存表示。如-23如果为八位有符号整型数,则其 绝对 值23的存表示为ObOOOlOlll,对其取反则为OblllOlOOO,再 加1为OblllO
9、lOOl,即为0XE9,与Keil仿真结果是相吻合 的:2.增强可移植性关于“增强可移植性用以下实例来讲解: 假如在一种单片机中unsigned char类型是八个位(1个字节),那么一个此类型的变量屮0x67,对其最低位清零。则可以用以下方法:8=0x67;/&二Ob 0110 0111a=a&0xfe; /a二Ob 0110 0110上面的程序似乎没有什么问题,使用Oxfe这一因子就可以实现一个unsigned ch吐型的变量最低位清零。但如果在另一种单片机中的 unsigned char类型被定义为16个位(两个字节),那么 这种方法就会出错,如下:b=0x6767; 假
10、设b为另一种单片机中的unsigned char 类型变量,值为 Ob 0110 0111 0110 0111 b二b&Oxfe; 如 果此时因子仍为Oxfe的话,则结果就为0b 0000 0000 0110 0110 即 0x0066,而与 0x6766不相吻合上例中的问题就是因为不同环境中的数据类型差异所造成的,即程序的可移 植 性不好。对于这种情况可以采用如下方法来解决:屮0x67; /a-Ob 0110 0111在不同的环境中将自动匹配运算因子,实现 最后一位清零护0x66其中r为ob imino b=0x6767; /a二0b 0110 0111 0110 0111 b=a1
11、;二0b 1111 1111 1111 llio, b=Ob 0110 01110110 0110 ,即 0x67665)左移运算符(VV)左移运算符用来将一个数的各位全部向左移若干位。如:表示将8的各位左移2位,右边补0。如果护34 (0x22或0b00100010),左 移 2位得0b 10001000,即十进制的136。高位在左移后溢 出, 不起作用。从上例可以看到,a被左移2位后,由34变为了 136, 是原来的4倍。而如果左移1位,就为ObOlOOOlOO,即十进制 的6&是原来的2倍,很显然,左移'位,就等于乘 以了 2、 '。但一结论只适用于左移时被溢出的
12、高位中不包含T'的情况。 比如:a=64; /a-Ob 0100 0000a=a«2;/a=0b 0000 0000其实可以这样来想,a为unsigned char型变量,值为64,左移2位后等于 乘以 了 4,即64X4 = 256,而此种类型的变量在表达256时,就成 为了 0x00,产生了一个进位,即溢出了一个T' o在作乘以2这种操作时,如果使用左移,将比用乘法 快得多。因此在程序中适应的使用左移,可以提高程序的运 行效率。6)右移运算符右移与左移相类似,只是位移的方向不同。如:a=a»l表示将a的各位向右移动1位。与左移相对应的,左移一位就相当于除
13、以2,右 移N位,就相当于除以2、。在右移的过程中,要注意的一个地方就是符号位问题。对 于无符号数右移时左边高位移和'O' o对于有符号数 来说, 如果原来符号位为'0',则左边髙位为移入'0',而如果符号位 为'1',则左边移入0还是'1'就要 看实际的编译器了,移入 '0,的称为“逻辑右移”,移 入T'的称为算术右移” o Ke订 中采用“算术右移”的方式来进行编译。如下: d二-32;/d为有符号整型变量,值为-32,存表示为0b11100000d=d»l; 右移一位 d 为 0b 11110000 即-16, Keil 采用算术逻辑进行编译7)位运算赋值运算符在对一个变量进行了位操作中,要将其结果再赋绐该变量,就可以使用位运算赋值运算符。位运算赋值运算符如&二,I =,二,二,二例如:a&二b相当于a=a&b, a»=2相当于a=a»2。8)不同长度的数据进行位运算如果参与运算的两个数据的长度不同时,如a为char 型,b为int型,则编译器会将二者按右端补齐。如果a为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于物联网技术的拼多多农业电商平台研究
- 旅游行业产品经理的职责与技能要求详解
- 旅行社计调经理的招聘面试全解析
- 基于地球仪视角的初中自然科学学习策略
- 护理礼仪的礼仪故事
- 护理课件制作中的游戏化设计
- 护理实践中的法律问题探讨
- 护理考试名师强化辅导
- 领导力培养与团队指导计划同仁堂副经理
- 基于家庭教育活动的家长培训计划设计
- 天津市河西区2024年九年级结课质量调查英语试卷
- 2024外研版初中英语单词表汇总(七-九年级)中考复习必背
- 六安职业技术学院单招《职业技能测试》参考试题库(含答案)
- 有关物业管家培训课件
- 第二章 教育研究的选题与设计
- 新改版苏教版四年级下册科学全册知识点(精简版)
- 流程图绘制培训
- 口腔颌面外科学课件:颌骨骨髓炎
- 上海市初中物理竞赛“大同杯”历年真题分类汇编(共9个)学生版+解析版
- 2023年广东高考英语听说考试真题D录音原文与参考答案
- 《史记》上册注音版
评论
0/150
提交评论