单片机C51位运算应用技巧

发布者:lambda21最新更新时间:2018-11-22 来源: eefocus关键字:单片机  C51  位运算 手机看文章 扫描二维码
随时随地手机看文章

 位运算应用口诀:


清零取位要用与,某位置一可用或,若要取反和交换,轻轻松松用异或!


移位运算要点


1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。


2 "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。


3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。


4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。


位运算符的应用 (源操作数s 掩码mask)


(1) 按位与-- &


1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)


2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)


(2) 按位或-- |


常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)


(3) 位异或-- ^


1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)


2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)


目标 操作 操作后状态


a=a1^b1 a=a^b a=a1^b1,b=b


b=a1^b1^b1 b=a^b a=a1^b1,b=a


a=b1^a1^a1 a=a^b a=b1,b=a


二进制补码运算公式:


-x = ~x + 1 = ~(x-1)


~x = -x-


-(~x) = x+


~(-x) = x-


x+y = x - ~y - 1 = (x|y)+(x&y)


x-y = x + ~y + 1 = (x|~y)-(~x&y)


x^y = (x|y)-(x&y)


x|y = (x&~y)+y


x&y = (~x|y)-~x


x==y: ~(x-y|y-x)


x!=y: x-y|y-x


x< y: (x-y)^((x^y)&((x-y)^x))


x<=y: (x|~y)&((x^y)|~(y-x))


x< y: (~x&y)|((~x|y)&(x-y))//无符号x,y比较


x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较


应用举例


(1) 判断int型变量a是奇数还是偶数


a&1 = 0 偶数


a&1 = 1 奇数


(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&


(3) 将int型变量a的第k位清0,即a=a&~(1<


(4) 将int型变量a的第k位置1, 即a=a|(1<


(5) int型变量循环左移k次,即a=a<


(6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)


(7)整数的平均值


对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:


int average(int x, int y) //返回X,Y 的平均值


{


return (x&y)+((x^y)>>1);


}


(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂


boolean power2(int x)


{


return ((x&(x-1))==0)&&(x!=0);


}


(9)不用temp交换两个整数


void swap(int x , int y)


{


x ^= y;


y ^= x;


x ^= y;


}


(10)计算绝对值


int abs( int x )


{


int y ;


y = x >> 31 ;


return (x^y)-y ; //or: (x+y)^y


}


(11)取模运算转化成位运算 (在不产生溢出的情况下):a % (2^n) 等价于 a & (2^n - 1)


(12)乘法运算转化成位运算 (在不产生溢出的情况下):a * (2^n) 等价于 a<< n


(13)除法运算转化成位运算 (在不产生溢出的情况下):a / (2^n) 等价于 a>> n


例: 12/8 == 12>>3


(14) a % 2 等价于 a & 1


(15) if (x == a) x= b;


else x= a;


等价于 x= a ^ b ^ x;


(16) x 的 相反数表示为 (~x+1)


(17) 实现最低n位为1,其余位为0的位串信息:~(~0 << n)


(18)截取变量x自p位开始的右边n位的信息:(x >> (1+p-n)) & ~(~0 << n)


(19)截取old变量第row位,并将该位信息装配到变量new的第15-k位:new |= ((old >> row) & 1) << (15 – k)


(20)设s不等于全0,代码寻找最右边为1的位的序号j:


        for(j = 0; ((1 << j) & s) == 0; j++) ;


关键字:单片机  C51  位运算 引用地址:单片机C51位运算应用技巧

上一篇:51单片机特殊功能寄存器中的字节寻址和位寻址
下一篇:单片机c51和一般的c语言有何不同之处?

推荐阅读最新更新时间:2024-03-16 16:18

飞思卡尔MZ系列微控制器 为中国国网电表量身打造
伴随着世界各国政府和企业对于建立智能电网来改进电能分配和节约电能的需求不断增大,智能电网作为下一代电网的发展模式,在全球范围内已获得广泛关注。国内对智能电网的建设和发展愈加重视,为此中国国家电网公司(“中国国网”)对智能电网进行了全新的规划,2010年中国将进入智能电网建设的实质性阶段。作为积极推动中国能源管理创新的半导体领导厂商,飞思卡尔半导体为国网电表量身打造出新一代智能微控制器(MCU)MZ系列,这一系列MCU具备低成本和价格竞争力,可实现灵活解决方案。飞思卡尔同时提供创新、便捷的参考设计,帮助开发人员设计出符合中国国网新标准的最佳方案。 国网新标准为单相电表设计提出一系列要求,例如:基本计量功能增加,费控功能
[单片机]
飞思卡尔MZ系列<font color='red'>微控制器</font> 为中国国网电表量身打造
学习笔记之-51单片机特殊功能寄存器
一.前言 学习51单片机的过程中,其实就是学习怎么用它的特殊功能寄存器(有些寄存器是我们看不到的),特殊功能寄存器是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据。我们写程序驱动硬件其实就是配置各种各样的寄存器,他是软硬件的最底层的一个接口。更加深入了解寄存器的工作过结构原理会在后面的内容中补充,这里只是把最常用的做一个整理,方便学习查阅。 51单片机内部共有21个SFR,其布局如图:    上面就是51系列单片机21个特殊功能的寄存器,我们可以根据是否可以位寻址把这些寄存器分成2类,这里先简单说一下什么是为寻址吧,从图中可以看出,每个SFR占1个字节,多数字节单元中的每一位又有专用的“
[单片机]
学习笔记之-51<font color='red'>单片机</font>特殊功能寄存器
一种基于单片机实现OLED显示的设计
1 引言 有机电致发光显示,又称有机发光二极管(Organic Light Emitting Diode, OLED)或有机发光显示器Organic Light Emitting Display(OLED),相较于目前市场上流行的液晶显示器(LCD)有明显的优势,主要表现为:自主发光(不需要背光源),无视角问题(视角可达170°以上),重量轻,厚度薄,亮度高,发光效率高,响应速度快(是液晶的1000倍),动态画面质量高,温度范围广(温度范围-40℃~80℃),低功耗,抗震能力强,制造成本低,可柔性显示。尤其适用于要求高亮度的仪表行业,以及条件要求更高的军工产品。 与各方面已经发展成熟的LCD相比,OLED的发展还处于初级阶
[单片机]
一种基于<font color='red'>单片机</font>实现OLED显示的设计
如何利用STM32单片机发送字符串
一、STM32有自己的字符发送函数。 void PC_SendChar(uint8_t DataToSend) { USART_SendData (USART1 ,DataToSend); while(USART_GetFlagStatus (USART1 ,USART_FLAG_TC )!=SET ); } 二、发送字符串函数是在字符发送函数的基础上编写的 void PC_SendString(uint8_t *str) { while(*str) { PC_SendChar (*str); str++; } } 三、发送字符串示例 PC_SendString((u8*) Welcome to the NDIR wo
[单片机]
MSP430单片机:时钟系统(UCS 模块)
UCS 模块最多含有 5 个时钟源: XT1CLK :低频 / 高频振荡器,可以使用低频 32768HZ 晶振和外部振荡器或者通过外部输入源输入 4MHZ~32MHZ 时钟。 VLOCLK :内部低消耗,低频振荡器。典型值为 12KHZ 。 REFOCLK :内部低频振荡器,典型值为 32768HZ ,作为 FLL 基准源。 DCOCLK :内部数字控制振荡器 (DCO) 可以通过 FLL 来稳定。 XT2CLK :可选择的高频振荡器,可以使用标准晶振,振荡器或者外部时钟源输 4MHZ~40MHZ 。 外部:XT1CLK XT2CLK 内部: VLOCLK REFOCLK DCOCLK UCS 模块可以产生三个时钟信号供
[单片机]
MSP430<font color='red'>单片机</font>:时钟系统(UCS 模块)
NXP:微控制器在边缘人工智能中扮演着越来越重要的角色
就在几年前,人们还认为机器学习(ML)甚至深度学习(DL)只能在高端硬件上执行,在边缘侧需要通过网关、边缘服务器或数据中心执行训练和推理,这在当时是一个主流观念,因为在云和边缘之间研究如何分配计算资源还处于早期阶段。但由于工业界和学术界的深入研究和开发努力,这种情况已经发生了巨大的变化。 如今,最新的微控制器(其中一些带有嵌入式ML加速器)可以将ML带到边缘设备中,性能也很强大,已经可以达到数TOPS了。 这些设备不仅可以执行ML,而且还可以以低成本、低功耗、仅在绝对必要时才连接到云端的特性。简言之,集成了ML加速器的微控制器代表了下一步,将计算应用到麦克风、摄像头和监控环境条件的传感器上,这些传感器产生的数据将在模块中就
[单片机]
NXP:<font color='red'>微控制器</font>在边缘人工智能中扮演着越来越重要的角色
SEPTNY256型单片机开关电源及其应用
1 TNY256的性能特点   ·内置自动重启电路,不需外接元件,一旦发生输出短路或控制环开路故障,可将占空比降低以保护芯片。   ·在输入直流高压电路中,不需要使用瞬态电压抑制器构成的钳位保护电路,仅用简单的RC吸收回路即可衰减视频噪声。   ·输入欠压检测电路仅需外接1只电阻,目的是在上电时将片内的功率MOSFET关断,直到直流输入电压VI达到欠压保护门限电压(100V)为止;正常工作后若VI突然降低,对芯片也能起到保护作用。   ·开关频率抖动可降低电磁辐射。   ·输入电压范围宽(85~265VAC或120~375VDC)且交、直流两用。效率高,265VAC输入时的空载功耗低于100mW。   ·控制方
[单片机]
单片机反汇编是什么? 什么是反汇编?
工程师编写单片机程序的时候一般是采用用汇编语言或高级语言(C或C++)编写的,这些程序代码叫原代码,当程序编写完成后,经过编译软件或编译器 的编译生成可以烧录到单片机ROM存储区里的文件,不同型号的单片机的编译器生成的文件后缀是不同的,但是常用的BIN和HEX文件,这些生成的文件在解 密行业里叫机器代码,及机器码,这样的机器码是在单片机里运行的,也可以说是只有机器能够读懂的。而反汇编即是指将这些执行文件,即机器码反编译还原成汇 编语言。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码会发生很大的变化,如果是语句比较多的汇编,一般人很难读懂,需要 自己加注释,然后去一条一条的读,是需要一定的毅力的,我曾经为
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved